Java Integer(-128~127)值的==和equals比较

Integer

有如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Integer i1 = 127;
Integer i2 = 127;
System.out.print(i1+" == "+i2+" :"+(i1 == i2));
System.out.println(" "+i1+".equals("+i2+") :"+(i1.equals(i2)));

Integer i3 = 128;
Integer i4 = 128;
System.out.print(i3+" == "+i4+" :"+(i3 == i4));
System.out.println(" "+i3+".equals("+i4+") :"+(i3.equals(i4)));

Integer i5 = new Integer(127);
Integer i6 = new Integer(127);
System.out.print(i5+" == "+i6+" :"+(i5 == i6));
System.out.println(" "+i5+".equals("+i6+") :"+(i5.equals(i6)));

Integer i7 = new Integer(128);
Integer i8 = new Integer(128);
System.out.print(i7+" == "+i8+" :"+(i7 == i8));
System.out.println(" "+i7+".equals("+i8+") :"+(i7.equals(i8)));

Integer i9 = new Integer(40);
Integer i10 = new Integer(40);
Integer i11 = new Integer(0);
System.out.println("i9=i10+i11 " + (i9 == i10 + i11));

输出结果如下:

1
2
3
4
5
127 == 127 :true    127.equals(127) :true
128 == 128 :false 128.equals(128) :true
127 == 127 :false 127.equals(127) :true
128 == 128 :false 128.equals(128) :true
i9=i10+i11 true

总结:

  1. 在-128~127的Integer值如果以Integer x = value;的方式赋值的Integer值在进行==和equals比较时,都会返回true
  2. 在-128~127之外的以Integer x = value;的方式赋值的Integer值在进行==和equals比较时,返回结果并不下相同
  3. 无论是在-128~127还是之外的Integer值如果以Integer x = new Integer(value);的方式赋值的Integer值在进行==和equals比较时,返回结果都并不x相同
  4. 因为Java里面对处在在-128127之间的使用Integer x = value;赋值的Integer值,用的是原生数据类型int,会在内存里供重用,也就是说这之间的Integer值进行==比较时只是进行int原生数据类型的数值比较,而超出-128127的范围,进行==比较时是进行地址及数值比较。
  5. 而对于所有以Integer x = new Integer(value);赋值的Integer值,使用== 比较时是进行地址及数值比较。
  6. 语句 i9 == i10 + i11,因为+这个操作符不适用于 Integer 对象,首先 i10 和 i11 进行自动拆箱操作,进行数值相加,即 i9 == 40。然后 Integer 对象无法与数值进行直接比较,所以 i9 自动拆箱转为 int 值 40,最终这条语句转为 40 == 40 进行数值比较
  7. 所以在比较包装类型的值时,必须使用equals进行比较