参考:https://www.cnblogs.com/dearcabbage/p/10603460.html
面试被问到int和Integer的区别,现在总结如下,有发现不对的请评论区指出
1.int是基本数据类型,Integer是引用类型,Integer是int的包装类
2.int的默认值是null,Integer的默认值是0
3.Integer有自动装箱和自动拆箱
比如 Integer i =1;因为Integer的自动装箱功能,通过反编译工具我们可以看到class文件下是
Integer a= Integer.valueOf(1);
而这句话 int b=a;实际经过了Integer的自动拆箱;
反编译生成的class文件是 int b = a.intValue();
4.关于Integer与int的值的对比
@Test
public void test(){
Integer o1 =new Integer(132);
Integer o2 =new Integer(132);
System.out.println("o1==o2---->"+(o1==o2));//false,两个对象
int o3=132;
System.out.println("o3==o1---->"+(o3==o1));//true
Integer O4 = 127;
Integer O5 = 127;
System.out.println("O4==O5---->"+(O4==O5));//true
Integer O41 = 129;
Integer O51 = 129;
System.out.println("O41==O51---->"+(O41==O51));//false
Integer o12=new Integer(1);
int z =1;
System.out.println("o12.equals(z)---->"+o12.equals(z));//true
}
结果
o1==o2---->false
o3==o1---->true
O4==O5---->true
O41==O51---->false
o12.equals(z)---->true
O4==O5---->true
为true是因为Integer自动装箱时对数值-128到127的对象放入缓存中,第二次就直接取缓存中的数据而不会new
O41==O51---->false 同上,超过了-128~127的范围,就无法从缓存里取了
o3==o1为true,是因为Integer类型和int比较时,会自动拆箱,化为基本数据类型。
o12.equals(z)结果为true,因为Integer重写了equals方法,数值一样就返回true
贴上源码图
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}