java两个Integer中为什么得出的结果为false
public static void main(String[] args) {
Integer i=12338;
Integer j=12338;
System.out.println(i==j);
}
} 展开
如果是equlse方法的话,肯定是相同的,因为是比较的值。
如果是“==”的形式,那么就有区别了,如果范围是“-128-127”,那么结果是true;如果范围不是“-128-127”,那么结果是false;
举例:
Integer str1=123343;
Integer str2=123343;
Integer str3=123;
Integer str4=123;
System.out.println(str1==str2);
System.out.println(str3==str4);
输出:false(换行符)true。
解释:实际上是在Interger中的valueOf处做了处理(缓存还是不缓存)。
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
超过“-128-127”的数据会进行缓存,也就是说地址就变了,所以就不同了。
Integer i = Integer.valueOf(12338);
Integer j = Integer.valueOf(12338);
你可以看一下jdk源码,方法如下。
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
默认的话他会缓存 -127到128之间的整数,其余的他会new。new的话两个对象的地址肯定是不一样的,也就是不相等了。如果你把12338变成-127到128之间的数结果就是true
i 和 j分别是两个Integer对象,在内存中的地址当然不一样,所以比较结果是false。
用int来定义的话,比较的就是值,结果就是true了。
当Integer i=10,Integer j=10,System.out.println(i==j);(其实值小于128大于0都为true)则结果为true。。。。。。这怎么解释
楼下的那位已经回答的很详细了,看看jdk的源码就知道了。
2014-05-08