public class Test{ public static void main(String[] args){
Integer t1 = new Integer(127);
Integer t2 = new Integer(127);
System.out.println("t1 == t2 ? " + (t1 == t2));
Integer t3 = 127;
Integer t4 = 127;
System.out.println("t3 == t4 ? " + (t3 == t4));
System.out.println("t1 == t4 ? " + (t1 == t4));
Integer t5 = 128;
Integer t6 = 128;
System.out.println("t5 == t6 ? " + (t5 == t6));
}
}
输出为 false,true,false,false
请问为什么,我只知道第一个false原因,其他的就不了解了谢谢
Integer t1 = new Integer(127);
Integer t2 = new Integer(127);
System.out.println("t1 == t2 ? " + (t1 == t2));
Integer t3 = 127;
Integer t4 = 127;
System.out.println("t3 == t4 ? " + (t3 == t4));
System.out.println("t1 == t4 ? " + (t1 == t4));
Integer t5 = 128;
Integer t6 = 128;
System.out.println("t5 == t6 ? " + (t5 == t6));
}
}
输出为 false,true,false,false
请问为什么,我只知道第一个false原因,其他的就不了解了谢谢
至于t3和t4则是用一个地址,后来定义的t4会查找127并指向t3,因此是true
t1在堆内存,t4在栈内存,因此也是false
最后一个不知道!!高手说说。。
提示构造函数Ingeger(int)未定义?
Integer有个内部类IntegerCache,它维护了一个Integer数组cache[] ,长度为256,还有一个静态块
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
很明显这个静态块已经默认认创建出了-128~127 的 Integer 数据,这也是JAVA出于性能考虑。
至于上面的代码经过编译后就变成了
Integer t5 = Integer.valueOf(128)
Integer t6 = Integer.valueOf(128)
System.out.println("t5 == t6 ? " + (t5 == t6));
看看Integer的valueOf方法,若是在-128到127之间的数,它会直接数据引用,因为它已经创建了数据对象,但若超出这个范围,它就new了一个Integer对象。所以值为128时,每次都是不同的对象。
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);
} 因此结果就是false