Java面试--int和Integer区别[详]

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);
        //falsenew生成的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]区间内,所以会在堆(不会复用)上新生成对象,所以内存地址不同,为falseint 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值