一、Integer类型对象之间大小比较
1. 使用new Integer()创建的对象:
① == 比较
- Integer i = new Integer(100);
- Integer j = new Integer(100);
- System.out.println(i==j); // false
【分析】 i,j是使用new方式创建了两个引用类型的对象,对象之间的“==”符是用来比较是否是一个对象的两个引用(即比较地址是否相同),两次new出来的对象地址显然是不可能相同的,故打印结果是false。
② “>”、“<” 、 “<=”、“>=”比较
- Integer i = new Integer(100);
- Integer j = new Integer(300);
- System.out.println(i<j); // true
【结论1】:使用new关键字创建的包装类型对象,不可以直接使用“==”来做大小比较,但可以使用“<”、“>”、“<=”、“>=”来做大小比较。
2. 使用Integer.valueOf()创建的对象
① == 比较
- Integer i = Integer.valueOf(100);
- Integer j = Integer.valueOf(100);
- System.out.println(i==j); // true
但是,
- Integer i = Integer.valueOf(400);
- Integer j = Integer.valueOf(400);
- System.out.println(i==j); // false
【结论2】:通过valueOf方法创建的Integer对象,也不能随便使用“==”比较大小,但可以使用“<”、“>”、“<=”、“>=”来做大小比较。
3.使用基本类型赋值创建的对象
- Integer i = 100; //自动装箱
- Integer j = 100;
- System.out.println(i==j); //true
但是,
- Integer i = 400;
- Integer j = 400;
- System.out.println(i==j) // false
【结论3】:使用Integer i = 400这种方法创建的包装类对象,也不能随便使用“==”来比较大小,但可以使用“<”、“>”、“<=”、“>=”来做大小比较。
二、Integer对象不同创建方法之间的区别
包装类型是不能够随便使用关系运算符比较大小的,针对三种创建对象的方法,原因分析如下:
① 对于new关键字创建的包装类对象,两次new得到的对象引用地址是不同的,不能使用“==”关键字做大小比较。
而使用“<”和“>”等运算符时,包装类型会调用valueOf方法,将运算符两边的对象都转换为基本类型后再做比较。
② 使用valueOf方法创建的Integer对象,使用“==”符号时,运行结果有时候正确,有时候不正确。查看valueOf方法的源码,如下:
1 public static Integer valueOf(int i) { 2 if(i >= -128 && i <= IntegerCache.high) 3 return IntegerCache.cache[i + 128]; 4 else 5 return new Integer(i); 6 }
通过看源码能够知道,整数类型在-128~127之间时,会使用缓存,造成的效果就是,如果已经创建了一个相同的整数,使用valueOf创建第二次时,不会使用new关键字,而用已经缓存的对象。所以使用valueOf方法创建两次对象,若对应的数值相同,且数值在-128~127之间时,两个对象都指向同一个地址。
③ 使用Integer i = 400这样的方式来创建Integer对象,与valueOf方法的效果是一样的。
包装类对象不可使用“==”符做比较运算,如果要进行比较运算时,最好使用java类库中的compareTo方法
三、本题的比较:
【注】int和Integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比。
【注】intValue()是把Integer对象类型变成int的基础数据类型;
parseInt()是把String 变成int的基础数据类型;
Valueof()是把String 转化成Integer对象类型;(现在JDK版本支持自动装箱拆箱了。)
parseInt()是把String 变成int的基础数据类型;
Valueof()是把String 转化成Integer对象类型;(现在JDK版本支持自动装箱拆箱了。)