作者
明明如月小角落
责编
屠敏
出品
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