Integer包装类源码分析

Posted 风中程序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Integer包装类源码分析相关的知识,希望对你有一定的参考价值。

版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习!

      今天上班的途中在手机里看到几道关于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包装类理解的更深了吧,记住一点,有疑问的时候能看源码的尽量看源码,还有什么比源码给出的回答更准确呢?

 

       

 

以上是关于Integer包装类源码分析的主要内容,如果未能解决你的问题,请参考以下文章

Integer 包装类源码实现与分析

JAVA——底层源码阅读——包装数据类型Integer.valueOf()自动装箱方法底层源码分析

ByteShortIntegerLong内部缓存类的对比与源码分析

Integer源码分析

JDK源码分析-Integer

JDK源码分析-Integer