比较包装器Integer对象

时间:2014-05-28 02:34:55

标签: java integer

我正在使用以下代码比较两个Integer对象....为什么输出是“两个整数都不相等...”虽然我已经读过某处Integer或int将仅在-128到127的范围内相等。为什么不是128?

Integer i1 = 128;
Integer i2 = 128;

    if(i1!=i2){
    System.out.println("Both integer are not equal...");

  }

2 个答案:

答案 0 :(得分:1)

Java Integer是一种引用类型,==通常不适合比较。

但是,对于较小的数字,Java实现了与自动装箱相关的缓存机制,使==运算符能够正常运行-128到127范围内的数字。

即,如果你这样做

Integer x = 12;
Integer y = 12;
boolean b = x==y;

b将为true

对于超出此范围的数字,它将无效。如果你这样做

Integer x = 200;
Integer y = 200;
boolean b = x==y;

b将为false,因为这些数字不是指向同一对象的引用。

答案 1 :(得分:0)

整数是引用类型。它们与int是不同的,它们是原始类型。

==运算符,当应用于引用类型时,检查引用相等性。本质上,这意味着两个引用是==当且仅当它们引用内存中的同一对象时。 .equals()运算符(i1.equals(i2))用于检查两个对象是否具有相同的值。

但是,某些具有特定值的引用类型存在某些预先存在的对象。如果编译器识别代码中的某些常量,它将创建一个新对象来保存该常量,而不是指向该预定义对象的引用。在下面的代码中,编译器不会为i1和i2创建新对象,而是将它们都设置为包含该值的预先存在的Integer。所以i1和i2引用相同的对象,因此彼此“==”。

Integer i1 = 50;
Integer i2 = 50;
Integer i3 = new Integer(50);
Integer i4 = new Integer(50);
System.out.println("does i1==i2? " + (i1==i2));
System.out.println("does i1==i3? " + (i1==i3));
System.out.println("does i3==i4? " + (i1==i4));

将输出

does i1==i2? true
does i1==i3? false
does i3==i4? false