包装类常量池
Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte,Short,Integer,Long,Character,Boolean;前面 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True Or False。如果超出对应范围仍然会去创建新的对象。
两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。
Integer 源码
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
示例:
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
Integer e = new Integer(127);
Integer f = new Integer(127);
System.out.println(a == b); // true
System.out.println(c == d); // false
System.out.println(e == f); // false
Double m = 1.0;
Double n = 1.0;
System.out.println(m == n); // false
Integer a = 127
;Java 在编译的时候会直接将代码封装成 Integer a = Integer.valueOf(127)
,从而使用常量池中的对象。Integer e = new Integer(127)
;这种情况下会创建新的对象
自动装箱与拆箱
Integer a = new Integer(50);
Integer b = new Integer(40);
Integer c = new Integer(10);
System.out.println(a == b + c); // true
因为 + 这个操作符不适用于 Integer 对象,首先 b 和 c 进行自动拆箱操作,进行数值相加,即 a == 40。然后 Integer 对象无法与数值进行直接比较,所以 a 自动拆箱转为 int 值 50,最终这条语句转为 50 == 50 进行数值比较。