boxing自动拆箱装箱
Integer a = new Integer(100);将int包装成Integer对象
Integer a =100;//自动装箱,把int转化成对象
int inta = a;//自动拆箱,相当于Int inta = a.intValue();所以a不能是null。
还有a的值要在-128至127之间初始化两个变量相等,否则会new Integer(),两个比较不相等
Integer与int的’==’比较问题
关于这方面的问题笔试遇到很多次,直接看代码,请问下面这段代码输出什么?
public class Test {
public static void main(String[] args) {
Integer a = new Integer(1);
Integer b = new Integer(1);
int c=1;
Integer e = 1;
System.out.println("a==b:"+(a==b));
System.out.println("a==c:"+(a==c));
System.out.println("a==e:"+(a==e));
System.out.println("c==e:"+(c==e));
}
}
输出结果如下:
a==b:false
a==c:true
a==e:false
c==e:true
解释:
1、a与b是两个引用类型变量,他们的值是为两个对象在堆内存中的分配空间的首地址,存放在栈的局部变量表中。
new了两个对象,堆内存中存放位置一定不同,所以a和b也一定不同,故false。
2、c与d为值类型,其值就存放在栈中,与堆内存无关,所以引用类型a与值类型c比较,a自动拆箱为int,与c进行值比较,故true。
3、而Integer d = 1;这条语句比较特殊,它是调用Integer.valueOf(1)自动装箱进Integer对象d,但这里有个很关键的问题,参看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 这个范围内的数被Java缓存,类似一个线程池或连接池之类的结构。
如果valueOf的数在这个范围之内的话,取到的就是同一个对象,用 == 来比较的话 结果就是true了;
否则就是两个new Integer(i) 的赋值语句,也就是创建了两个Integer对象,自然用 == 来比较的话 结果就是false了。