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的对象,肯定不相等吧。要么就是共享的内存区域 ,也自然不会相等。