【问题标题】:Java autoboxing and comparison of Objects using operators [duplicate]Java自动装箱和使用运算符比较对象[重复]
【发布时间】:2018-02-10 20:01:42
【问题描述】:

当数值比较运算符用于比较 Java 中的 2 个整数对象时,我试图了解以下代码的行为。

    Integer i1 = new Integer(1);
    Integer i2 = new Integer(1);
    System.out.println(i1 == i2);
    System.out.println(i1 > i2);
    System.out.println(i1 >= i2);

以上代码的输出是:

false
false
true

我了解第一种情况下发生的情况(对象实例的比较是这样的,这就是它给出错误的原因)。但是为什么第二种和第三种情况不同,它是如何工作的呢?

【问题讨论】:

  • 我对你的结果感到困惑。我认为 JLS 需要在 -128 到 127 范围内的 Integers 进行缓存并且是同一个对象。 stackoverflow.com/questions/20897020/…
  • @markspace 仅在自动装箱或调用valueOf() 时。使用 new 关键字创建的对象必须始终是不同的。
  • @shmosel 啊,对!我链接到的 SO 问题说“盒装”对象。感谢您指出这一点。
  • @shmosel - 我不明白stackoverflow.com/questions/1514910/… 是如何回答这个问题的。此链接不讨论使用运算符比较对象。
  • 确实如此,简单地说。 数字比较运算符的每个操作数的类型必须是可转换(第 5.1.8 节)为原始数字类型的类型 - 这意味着操作数被视为数字,而不是对象。

标签: java integer comparison autoboxing


【解决方案1】:

因为<>>=<=是数值比较,因此编译器知道它必须进行拆箱。

但是,==!= 始终用作非原始类型的参考比较器。

【讨论】:

  • 二进制数字提升(转换为数字)在 (JLS 15.20.1) 中指定的第 2 和第 3 方案中对 和 >= 操作数执行。但是,在 != 和 == 的情况下,至少有一个操作数必须是数字类型才能进行提升。
猜你喜欢
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 2018-06-20
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多