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); }