说来惭愧,不久前一次面试被问到Integer和int的区别,憋了半天只说出了Integer默认值为null。水平过不去,面试自然是失败了,那这二者除了默认值不一样外究竟还有有何区别,就让我们来看一看吧。
· 区别
1.int是java的一种基本数据类型,而Integer实际上是int的包装类;
2.Integer必须实例化后才能使用,当我们声明一个【Integer i = 10;】的时候,实际上在编译时会翻译为【Integer i = Integer.valueOf(10);】,在java中关于Integer.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之间的数,会在缓存中进行读取,这是因为Integer已经提前将区间[-128,127]内的数都提前实例化了。当然,这个实例化的范围也是可调的。当且仅当要new的数值超过了这个范围,Integer才会返回一个new Integer(i)。所以其实new一个Integer实际上是对一个对象的引用。
当然,基本数据类型是不需要实例化的,int直接存储数值。
3.Integer的默认值是null,int是0。
· 比较
1. Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.print(a==b); //false
原因:new产生的是对象,两个两个对象的内存地址自然不同。
2. Integer a = new Integer(1);
Integer b = 1;
System.out.print(a==b); //false.
原因:声明a时实际上是产生指针指向堆中新建的对象,而声明b时指向的是java常量池中的对象,两者内存地址自然不同。
3. Integer a = 1;
Integer b = 1;
System.out.print(a==b); //true.
Integer a = 128;
Integer b = 128;
System.out.print(a==b); //false.
原因:在默认情况下,若使用Integer声明的值区间在[-128,127]内,则实际上声明的变量均指向java常量池中对象,内存地址相同;若超过范围,则会调用new Integer()方法,产生新对象。
4.int变量与Integer比较时,只要值相等,则比较结果即为true。
原因:进行此类比较时,Integer类型会自动拆箱(intValue()方法)为int类型再进行比较。
*由于默认值的原因,int与Integer相比较时建议使用equals方法,否则容易出现空指针。