Integer a = 1; Integer b = 1; Integer c = 500; Integer d = 500; System.out.print(a == b); System.out.print(c == d);上述代码返回结果为:
Integer代码
Integer a = 1; Integer b = 1; Integer c = 500; Integer d = 500; System.out.println(a==b); // true System.out.println(c==d); // false
原因:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
// IntegerCache.low = -128,IntegerCache.high=127 Integer的自动装箱会调用valueOf方法,该方***缓存-128~127之间的数据(配置了255个Integer对象),赋值在这个区间之内就直接返回一个对象,所以两次返回的是同一个对象 -128~127区间内的值都会重新申请一个对象,所以两次对象不一样。 Character代码:
Character a = 'c'; Character b = 'c'; Character c = '开'; Character d = '开'; System.out.println(a==b); // true System.out.println(c==d); // false
原因:
public static Character valueOf(char c) {
if (c <= 127) { // must cache
return CharacterCache.cache[(int)c];
}
return new Character(c);
} Integer,都会有一个缓存。字符的值小于127就会被缓存。大于127就会重新构建一个对象 Double和Float代码
Double a = 1.0; Double b = 1.0; Double c = 500.0; Double d = 500.0; System.out.println(a==b); // false System.out.println(c==d); // false
原因:
public static Double valueOf(double d) {
return new Double(d);
}