来聊聊Integer和int吧

说来惭愧,不久前一次面试被问到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方法,否则容易出现空指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值