Java Integer封装类的IntegerCache内部类

Posted

tags:

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

个人理解,不喜勿喷,欢迎指正。

首先看下面这段代码,猜一下输出结果是什么

1         Integer a = 10;
2         Integer b = 10;
3         System.out.println(a == b);
4         a = 100;
5         b = 100;
6         System.out.println(a == b);
7         a = 1000;
8         b = 1000;
9         System.out.println(a == b);    

你以为是true true true 或者是false false false吗?

天真,看下图

技术分享

你没看错,就是这么坑!

按理说,Integer是封装类型,结果应该是false false false。

那么我们看下这段代码到底是怎样执行的,会出现这种结果

首先赋值时,先调用了下面的函数,这里出现了个奇怪的东西,IntegerCache,看起来问题就在这里

技术分享

接下来看一下IntegerCache到底是个什么东东,下面是该类的源码

技术分享

在源码中我们看到这个类有一个[-128,127]的Integer数组cache(这个数组的上限看起来好像是可以变的,但是我没有rt的源码包,所以不知道具体细节),所以在看Integer赋值的代码,就很清晰了

技术分享

 这里判断你赋值的数大小是否被包含在IntegerCache的cache数组内

如果在,就返回该对象的引用,因而小于等于127大于等于-128的数,通过==比较可以得出结果为true,因为引用相同,而超出范围的数就调用Integer的构造函数重新创建一个Integer对象因而虽然值相同但是由于引用不同而得出结果为false

所以判断对象的值是否相同时还是使用a.equals(b)

技术分享

 

以上是关于Java Integer封装类的IntegerCache内部类的主要内容,如果未能解决你的问题,请参考以下文章

java基础---Integer缓存机制---Integer缓存机制

integer和int的区别

int 和 integer的区别。用法

JAVA里面的int类型 和Integer类型,有啥不一样

Java 常用对象-基本类型的封装类

什么是int?int和Integer有什么区别?