版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习!
今天上班的途中在手机里看到几道关于Integer拆装箱的小题目,正好有点时间翻看了一下Integer类的源码,加上自己的一点思考,决定写点东西。
先来看看下面的代码:
如果这道题你能得出正确答案并了解其中的原理,说明你的基础还可以。如果你的答案是true和true的话,建议你去看看书。
程序运行结果:
我们知道==比较的是两个对象的引用,这里a、b、c、d都是新建出来的对象,按道理都应该输出false才对, 想知道其中的原理,我们去看看Integer.java这个类的源码就知道了。
当我们声明Integer c = 10;的时候,此时编译器会进行自动装箱操作,简单的说,也就是把基本数据类型转换成Integer对象,而把int型转换成Integer对象正是调用的valueOf(int i)方法。从上面的源码中可以看出,Integer中把-128--127这256个数据缓存了下来。官方的说法是这些小的数字使用的频率比较高,为了优化性能,就把这之间的数缓存了下来。这就是为什么输出结果是false和true了。当声明的Inetger对象的值在-128--127之间时,引用的是缓存中的同一个对象(已经创建好保存在缓存中),所以结果是true;当声明的Integer对象的值不在这个范围之类的时候,就会通过new Integer(i);语句创建一个Integer对象。
我们再来看下面这段代码:
如果这道题你能很快给出正确答案,那么==比较符你就掌握的比较透彻了。公布答案:
看到这个答案,小伙伴们可能又会不解,上面不是说Integer把-128--127缓存起来了吗,这个不应该是true吗?但是你仔细看,这里的Integer对象是我们自己new出来的,并不是用缓存,所以结果是false。那第一个为啥又是true呢?首先这里b的值为1000,肯定跟我们所知的Integer缓存没关系,既然和缓存没有关系,a是我们new出来的对象,那应该输出false才对呀?注意这里b是int型,当int和Integer进行==比较的时候,Java编译器会把Integer进行自动拆箱,也就是把Integer转为int型,所以这里进行比较的是int型的值,因此结果为true。
好了,经过以上分析,相信小伙伴们对Integer包装类理解的更深了吧,记住一点,有疑问的时候能看源码的尽量看源码,还有什么比源码给出的回答更准确呢?