问题1
Integer a = 9; int b = 9; boolean f = a==b;
这里的输出是true,通过断点分析发现,在进行**==**判断的时候Integer类型的a拆箱,然后再对像个int类型的数据进行比较
问题2
Integer a = 9; int b = 9; boolean ff = a.equals(b);
这里自己先分析一下,应该是先对b进行装箱,让后再进行equal比较。断点分析一下,确实如此
通过断点测试发现:一个Integer·数据和一个int数据进行+,-,*,/,%运算都是先拆箱成int类型的数据在进行运算的
个人看法:开发jdk的类代码的人都是大牛中的大牛,考虑问题一定很完全,会找到之间复杂度与空间复杂度对小的实现来完成。所以自动拆箱与自动装箱的过程也就不难理解了
问题3
Integer i=null; int j=i;
运行:
报错,NullPointerException
分析:i是Integer类型的值为null的对象,第二行,i进行拆箱调用intValue()方法代码如下
public int intValue() { return value; }
从代码中可以发现return返回value,但实际上他写完整是:this.value 。所以当Integer对象为null拆箱时,会报空指针异常。
问题4
Integer a=127; Integer b=127; Integer c=128; Integer d=128; System.out.println(a==b); System.out.println(c==d);
不妨先想想这个的输出结果,乍一看立马就会脱口而出两个true。
但实际上是true,false。
原因:
Integer的值在-128到127时,Integer对象是在IntegerCache.cache产生,会复用已有对象,也就是说,这个区间的Integer可以直接用等号进行判断。
Integer的值在-128到127之外时,Integer对象在堆上产生,不会复用已有对象,用等号会返回false