在面试的时候或者平常有人问你java中int与Integer的区别,你该如何回答?
大部分的回答,估计是Integer是int的包装类,可以自动拆箱和装箱,然后,就没有然后了。那你觉着这样的回答,提问的人会满意吗?
个人认为应该这样回答:
(1)int是java种8中基本类型之一,java中的8中基本类型分别是boolean,byte,char,short,int,long,float,double,它们分别有对应的包装类,其中int对应的包装类是Integer,Integer还有许多静态方法,比如我们常用的parseInt,可以将String类型转为int,当然还有其他转换的方法,不一一列举了,感兴趣的参考JDK文档。
(2)Integer是类,定义变量的时候,可以这样定义:
Integer a = 100;
Integer b = 100;
Integer c = 150;
Integer d = 150;
Integer e = new Integer(100);
Integer f = new Integer(100);
那么请问,a==b? c==d? a==e? e==f
如果你在eclipse中编写上述代码,输出的结果应该是 true false false false
是不是很奇怪,比较的结果应该是要么相同,要么不同,怎么会是这样呢?这就和Integer的实现原理有关了,如果你查看Integer的源代码,你会发现,对于在-128-127之间的数字,Integer会进行缓存,具体参见下面的valueof方法:
1 public static Integer valueOf(int i) { 2 assert IntegerCache.high >= 127; 3 if (i >= IntegerCache.low && i <= IntegerCache.high) 4 return IntegerCache.cache[i + (-IntegerCache.low)]; 5 return new Integer(i); 6 }