今天在菜鸟回看基础数据类型的时候,看到一条笔记,然后看到自动转换不太明白引申出关于包装类的一个问题,然后又看到java踩坑笔记,感觉文章说的并不十分清晰,我自己琢磨了一会,决定起码先把问题记下来.
Integer x = new Integer(1000);//包装类,先创建一个new Integer()空间,然后指向1000,
Integer y = 1000;
Integer z = 1000;
System.out.println(x == y); //false
System.out.println(x == z); //false
System.out.println(y == z); //false
三个全是false 意味着这三者是空间地址都不相同,也就是三者都是new了一个新对象.于是我用反编译器看看源码.
Integer x = new Integer(1000);
Integer y = Integer.valueOf(1000);
Integer z = Integer.valueOf(1000);
说实话,仍然不太理解,然后看看valueOf方法的源码
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
到这里,理解了,包括最早的入池的概念,IntegerCache这个类里有个数组叫cache[],如果在-128-127之间,第一次引用时入池,再次引用直接调用.如果不再new一个新的对象.所以1000不在范围内,每次都需要new一个新的对象,所以创建了三个对象.