【强制】所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较
对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象是在IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断.
来自–《阿里巴巴 Java 开发手册》
Integer a = 1;
Integer b = 1;
System.out.println(a == b);
System.out.println(a.equals(b));
System.out.println("----------------");
Integer a1 = new Integer(100);
Integer b1 = new Integer(100);
System.out.println(a1 == b1);
System.out.println(a1.equals(b1));
System.out.println("----------------");
Integer a2 = -128;
Integer b2 = -128;
System.out.println(a2 == b2);
System.out.println(a2.equals(b2));
System.out.println("----------------");
Integer a3 = 129;
Integer b3 = 129;
System.out.println(a3 == b3);
System.out.println(a3.equals(b3));
结果如下:
true
true
----------------
false
true
----------------
true
true
----------------
false
true
说明:
第一段和第三段代码中Integer中-128~127之间的数都是由IntegerCache.cache产生,当创建一个对象以后,如果下一个创建的对象值相等,会直接复用已有对象,此时使用==比较的话,会直接返回true
第二段代码是new对象,会产生两个新对象,虽然值相同,但是它们所指向的地址是不同的,使用==比较,返回false
第四段代码是由于129超出了Integer的值的范围,此时会在堆上产生新的对象,不会再去复用已有的对象,此时使用==比较,返回false