之前有看见一个题,题就不说了,最终结论是 Integer对象在创建的时候,对于-128~127数字将会不会创建新的对象,而是直接应用常量池中Integer对象。
然后最近,在StackOverflow看到一个比较有意思的问题
public class Test {
public static final Test me = new Test();
public static final Integer I = 4;
public static final String S= "abc";
public Test() {
System.out.println(I);
System.out.println(S);
}
public static Test getInstance() { return me; }
public static void main(String[] args) {
Test.getInstance();
}
}
最终运行输出的结果则是
null
abc
为何是这个结果。如果把
public static final Integer I = 4;
替换为
public static final int I = 4;
那么打印的结果就会是4 和 abc
为何会这样
因为在创建静态常量的时候, Integer I=4 最终调用的是 Integer.valueOf(4),而不是直接在常量池中创建对象。那么导致的则是在初始化的时候,常量池中并没有Integer对象的值。
而String类型 则直接会在常量池中创建对象,所以可以直接调用该值。
所以在第一次初始化常量的时候,Integer 由于内部产生对象调用的是Integer.valueOf()的方法,而常量池中并没有相匹配的值,导致第一次初始化后Integer是一个空值。当第一次初始化结束后,Integer常量对象才会产生相对应的值。
而之后在 new Test();或者调用该实例化方法 getInstance() 是,才会显示Integer常量对象
public static void main(String[] args) {
<span style="white-space:pre"> </span>new Test();
Test.getInstance();
}
输出结果为:
null
abc
4
abc