1. 这个 System.out.println("num3: "+ (1==i2));
System.out.println("num4: "+ (1==i4));
都是true是因为在jdk1.5之后, 基本数据类型的包装类和该基本数据类型比较的时候会自动拆箱为int型, 转为Integer类型,所以相等;
2. Integer i2 = new Integer(1); //i2的引用指向堆内存
Integer i4 = Integer.valueOf(1); //i4的引用指向常量池
所以为false
3. 关于Integer还有一个很重要的知识点,面试点
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2); //答案是true
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4); //答案是什么?哈哈楼主想一想,正确答案是false~
//////////////////////////////////////////////////////////////////////////////////////////
原因是:其实java在编译Integer i1 = 127的时候,被翻译成-> Integer i1 = Integer.valueOf(127);所以关键就是看valueOf()函数了。只要看看valueOf()函数的源码就会明白了。JDK源码的valueOf函数式这样的:
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
//当Integer的值在-128 - 127之间时会进行缓存, 如果之前已经创建了一个127, 后创建的就会从缓存中取, 而不是new, 当不在这个范围内时, 就会重新创建new对象
.. 所以是false, 楼主明白了么
|