【问题标题】:Comparing wrapper Integer objects [duplicate]比较包装整数对象[重复]
【发布时间】:2014-07-17 02:31:52
【问题描述】:

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

Integer i1 = 128;
Integer i2 = 128;

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

  }

【问题讨论】:

  • 对于潜在的回答者:我相信问题是“为什么Integer 缓存只从-128 变为127?”
  • @user3580294:我已经走了那条路,并被告知另一件事。
  • @RobertHarvey 其他事情?我主要是离开 OP 的最后一句话......
  • 我应该指出这是 JVM 特定的。 6-b14 有 -128 .. +127。 7u40-b43 正在使用属性 java.lang.Integer.IntegerCache.high。这是JLS 的一部分

标签: java integer


【解决方案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,因为这些数字是不指向同一个对象的引用。

【讨论】:

  • 刚看到这是一个骗局,另一个问题的答案基本相同,但更好的说法是......废话!
  • 我不会说 == 在该范围内“正常”工作:也许您可以说它等同于 equals。在所有情况下,== 通过比较参考身份按指定的方式工作(即正确)。
【解决方案2】:

整数是引用类型。它们与原始类型的 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

【讨论】:

  • 感谢 user2321368。答案对我来说似乎是一些新知识...
猜你喜欢
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 2021-11-01
相关资源
最近更新 更多