/**
* 自动装箱的陷阱
* @param args
*/
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3l;
/**
* 原因: 内存地址相同, 小整数采用享元设计模式
*/
System.out.println(c == d);//true
/**
* 内存地址不同,
* 系统把-128~127之间的整数自动装箱成Integer实例,
* 并放入一个名为cache的数组缓存起来,
* 如果把一个-128~127之间的整数自动装箱成一个Integer实例,
* 实际上就是直接指向数组元素,所以相等;
* 但每次把一个不在-128~127的范围内整数自动装箱成Integer实例时,
* 系统需重新创建一个Integer实例
*/
System.out.println(e == f);//false
System.out.println(c == (a + b));//true
System.out.println(c.equals((a + b)));//true
System.out.println(g == (a + b));//true
System.out.println(g.equals(a + b));//false
}
示例来自<<深入理解Java虚拟机>>第二版,