Java面试题—int和Integer区别
本质上区别:
1、Integer是int的包装类,int则是java的八种基本数据类型之一;
Integer x = 2; // 装箱 调用了 Integer.valueOf(2)
int y = x; // 拆箱 调用了 X.intValue()
注:基本类型都有对应的包装类,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成
2、Integer变量必须实例化后才能使用,而int变量不需要 ;
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 ;
4、Integer的默认值是null,int的默认值是0。
Integer a = new Integer(10);
Integer b = new Integer(10);
System.out.println(a == b);
//false
a和b是两个Integer变量,Integer变量实际上是对Integer对象的引用(引用存储的是对象被存放的内存地址),而new生成的是两个对象,在堆中内存地址不同,所以a和b不相等,结果为false。
Integer c = new Integer(10);
int d = 10;
System.out.println(c == d);
//true
由于包装类Integer和基本数据类型int在进行比较的时候,Java会自动将Integer拆箱为int,即,调用c.intValue(10),然后进行比较,实际上就是两个int变量的比较,只要两个变量的值是相等的,结果就为true。
Integer e = new Integer(10);
Integer f = 10;
System.out.println(e == f);
//false
非new生成的Integer变量f指向的是常量池中的对象,即,存储的是常量池中对象的地址,new生成的Integer变量指向堆中新建的对象,即,存储的是堆中对象的地址,两者在内存中地址不同,所以结果为false。
Integer g = 10;
Integer h = 10;
System.out.println(g == h);
//true
声明Integer g = 10;的时候,Java自动装箱为Integer g = Integer.valueOf(10),先查看Integer类的valueOf方法:
// range [-128, 127] must be interned (JLS7 5.1.7)
// static final int low = -128;
// assert IntegerCache.high >= 127;
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
观察源码可以发现,当 i>=-128并且 i<=127的时候,第一次声明会将 i 的值放入缓存中,第二次直接复用缓存里边已有的对象,而不是重新创建一个Integer对象。
因为g和h指向同一个缓存区的对象,所以其对象的地址自然相同,所以结果为true。
这个区间内的Integer值可以直接使用 == 判断,但这个区间外的所有数据,都会在堆上产生,并不会复用已有对象。这组的 g 和 h 都在这个区间内,所以结果为true。
Integer i = 128;
Integer j = 128;
System.out.println(i == j);//false
因为i和j不在[-128, 127]区间内,所以会在堆(不会复用)上新生成对象,所以内存地址不同,为false。
int k = 10;
Integer l = 10;
System.out.println(k == l);//true
Integer自动拆包,调用i.intValue(10);也就是比较两个基本数据类型,结果为true
int m = 128;
Integer n = 128;
System.out.println(m == n);//true
和上组一样的道理
总结:int 和 Integer比较,无论是否有new,只要数值相同,结果都为true。
扩展(new Integer(123)和integer.valueOf(123)的区别
- new Integer(123)每次都会新建一个对象;
- Integer.valueOf(123)会使用缓存池中的对象,多次调用会取得同一个对象的引用。
Integer x = new Integer(123);
Integer y = new Integer(123);
System.out.println(x == y); // false
Integer a = Integer.valueOf(123);
Integer b = Integer.valueOf(123);
System.out.println(a == b); // true