面试题-Integer和int的区别

Integer和int的区别:

前者是对象,可以调用许多方法,具体可以看源码,后面则是基本数据类型


比较1:int 和integer的比较

int i = 1;
Integer j = 1;
System.out.println((i == j) + "");
这里是相同的,因为Integer会被自动拆箱成int去和i比,这里就变成了基本数据类型之间数值的比较

(如果不知道什么是自动拆箱可以 看我另一篇文章 java的自动装箱拆箱,非常的简单明了)

(我这里也简单讲一下自动拆箱:就是把Integer变成基本数据类型了int)


比较2:new两个Integer对象进行比较

Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println((i == j) + "");
这里是不同的,因为对象嘛,已经是两个实例的,存放在堆内存中的地址都不一样了。如果他不会自动拆箱的话,我们输出他们的地址,会发现地址是不一样的。这里实际上就是地址间的比较。


比较3:非new出来的两个Integer比较

Integer i = 1;
Integer j = 1;
System.out.println((i == j) + "");

Integer i = 128;
Integer j = 128;
System.out.println((i == j) + "");
结果你会发现上面的是true,下面的是false。为什么?先提一下Integer这样声明,就会自动装箱,简单的说,就是等效于 

Integer i = Integer.valueOf(1);

而问题就出在这个valueOf方法里。他会缓存-128-127的数,而128后面的数会返回给你一个新的对象,两个不同的对象自然是不相等的。而返回给你缓存的,就可能是静态的区域,把共享的内存返回给你了,所以地址也是一样的,不信看源码。

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

比较4:一个new出来的Integer和非new出来的Integer进行比较

Integer i = 128;
Integer j = new Integer(128);
System.out.println((i == j) + "");
这也是肯定不会相等的,Integer非new生成的数字,要么就是大于等于128,是new的对象,肯定不相等吧。要么就是共享的内存区域 ,也自然不会相等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值