本文讲解的是不用new关键字去创建Integer,它的引用会有什么不同。
题目
笔者是一个Java基础不怎么牢固的CRUD工程师,前些日子,我们老师给我们出了个题,题目如下:
Integer num1 = 128; Integer num2 = 128; System.out.println(num1 == num2);
当时我的想法是,Integer是一个引用数据类型,那它每次创建不都应该是一个新的地址引用吗?然后果断答了false,答案是对的,但是验证过程却错的离谱。
答案:false
我们再来看一个题
Integer num3 = 127; Integer num4 = 127; System.out.println(num3 == num4);
那个题和上面题相似度99%,只是存储的变量从128降到了127,嗯,难道减了个1结果还发生变化吗?是的。
答案:true
那这是为什么呢?
解题
我首先拿着第一个题,在第一行打上断点,开始debug。
按下Alt + Shift + F7 追进去看看,我们发现创建变量时做了一个判断,当你创建的数字 >= low && <= high的时候,它返回了一个数组的元素,那这个范围是多少呢?
我们往上翻,会看到:
我们发现这个范围就是-128到127之间,那它返回的数组是什么呢?我们发现cache
是一个Integer数组,长度是(127 - (-128)) + 1 = 256,他的元素是从low ~ high。
总结
从以上的源码分析,我们发现:
Integer如果在 -128 - 127 之间的时候,它引用的是cache数组的元素;
超过范围,就用new去开辟一个空间。