Integer的valueOf方法与缓存策略
问题的导火索
今天做了牛客网的笔试题,有一道选择题是这样的,给差不多是下面这样的一段代码,问输出是啥~~
public class Test {
public static void main(String[] args) {
Integer a = 3;
Integer b = 3;
System.out.println(a == b);
Integer c = 321;
Integer d = 321;
System.out.println(c == d);
}
}
就这个代码,我当时选的是两个true,我觉得3和321并没有区别,也就是说a和b引用的是同一个对象,c和d引用的也应该是同一个对象,这一题怕不是考心理的哦~~~
笔试结束之后我立刻试了一下,发现自己还是太年轻。第一个输出是true,第二个输出是false。当场懵逼,遂单步调试之~~~这里为了方便说明,我就以下面代码展示调试过程:
public class Test {
public static void main(String[] args) {
Integer a = 3;
}
}
调试过程:
在Integer a = 3;前添加断点,程序运行到此处单步调试,由于java的自动装箱机制,编译器会把它编译成Integer a = Integer.valueOf(3);于是会进入valueOf()方法如下:
@HotSpotIntrinsicCandidate
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= Integ