竹笋

首页 » 问答 » 灌水 » 你真的理解Integer的缓存问题吗CS
TUhjnbcbe - 2023/4/26 19:57:00

作者

明明如月小角落

责编

屠敏

出品

CSDN博客

背景

下面给出一个例子,问输出的结果是多少:

publicclassIntTest{publicstaticvoidmain(String[]args){Integera=,b=,c=,d=;System.out.println(a==b);System.out.println(c==d);}}

很多新手可能非常犹豫,有一些经验的同学可以回答出标准答案。

问原因则随口就说”Integer缓存了-到之间的整数对象“,为什么会缓存?还有其他答案?可能就不知道了。

what???难道这不是标准答案?还想咋地?

分析

运行

想知道答案很容易,直接运行,结果是true,false。

源码法

直接看源码,我们知道声明整数时,会通过java.lang.Integer#valueOf(int)构造(不信可以断点)。

/***Returnsan{

codeInteger}instancerepresentingthespecified*{

codeint}value.Ifanew{

codeInteger}instanceisnot*required,thismethodshouldgenerallybeusedinpreferenceto*theconstructor{

link#Integer(int)},asthismethodislikely*toyieldsignificantlybetterspaceandtimeperformanceby*cachingfrequentlyrequestedvalues.**Thismethodwillalwayscachevaluesintherange-to,*inclusive,andmaycacheothervaluesoutsideofthisrange.**

paramian{

codeint}value.*

returnan{

codeInteger}instancerepresenting{

codei}.*

since1.5*/publicstaticIntegervalueOf(inti){if(i=IntegerCache.lowi=IntegerCache.high)returnIntegerCache.cache[i+(-IntegerCache.low)];returnnewInteger(i);}

通过源码和注释可以看到如果是-到之间的整数,则会使用整数缓存对象,否则就new一个整形对象。

因此第一个是true,第二个是false。

反汇编

前面讲到了,用到了再问一个问题为什么调用了java.lang.Integer#valueOf(int)?

我们直接反汇编:javap-cIntTest

CompiledfromIntTest.javapublicclass

1
查看完整版本: 你真的理解Integer的缓存问题吗CS