【问题标题】:Compare two Integer: why is == true? [duplicate]比较两个整数:为什么 == 为真? [复制]
【发布时间】:2011-09-05 14:46:19
【问题描述】:

可能重复:
Wrapper class and == operator

您好,当我将 Integer 与 == 进行比较时,我遇到了一些问题,所以 你能解释一下为什么第二次测试也成功了吗?

@Test
public void integerTest() {
    Integer prvni = 127;
    Integer druhy = 127;
    Integer treti = 128;
    Integer ctvrty = 128;

    assertTrue(prvni == druhy);
    assertTrue(treti != ctvrty);

}

【问题讨论】:

标签: java integer


【解决方案1】:

当使用== 比较对象时,您实际上是在比较引用。即,两个断言都为真的原因是因为 prvnidruhy 指的是同一个对象,而 tretictvrty 不是。

这是因为 JVM 缓存 Integer 范围 -128 到 127 的对象,并在自动装箱时重用缓存的对象。

除非你改用int,否则你可以改用prvni.intValue()或使用prvni.equals(...)

【讨论】:

  • 如果您将 128 更改为该范围内的数字(例如 125),则代码将按预期工作。为什么java不在运行时缓存数字?
  • 范围错误--128 到 127。
  • @leifg:Java 使用数组作为Integer 缓存的后备存储。数组不能在运行时调整大小,也不能用于稀疏结构(即,缓存相距很远的值,中间没有缓存对象)。可以使用 Hashtable 或类似的,但它们只允许有 Object 键,这意味着您必须使用 Integer 对象(而不是 int 原语)作为键,这只会带来整个问题又来了!所以唯一的选择是使用一个合理范围的数组。
  • @Platinum,谢谢。已更新。
【解决方案2】:

从 Java 1.5 开始,some of the wrapper classes have introduced a cache。对于Integer,任何介于 -128 和 127(含)之间的数字都在缓存中。其他值每次都需要包装在new Integer 中。

== 运算符比较引用。由于 127 的缓存整数值实际上是同一个对象,== 返回true。对于这 128 个Integer 对象,它们是两个不同的对象,具有不同的引用相等性。

有两种更可靠的方法可以比较相等性:

if (treti.equals(ctvrty)) { /* do something */ }

或:

if (treti.compareTo(ctvrty) == 0) { /* do something */ }

后一个比较利用Integer实现Comparable接口这一事实,因此定义了一个compareTo方法,如果第一个对象“小于”第二个对象,则返回负值,如果第一个对象“大于”第二个对象,如果两个对象比较相等,则为零。

【讨论】:

    【解决方案3】:

    自动装箱功能为每个对象创建一个新实例。

    试试这个:

    int treti = 128;
    int ctvrty = 128;
    

    【讨论】:

    • -1:没有解释为什么 127 案例有效,也没有完全回答问题。查看包装类缓存。
    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 2016-03-16
    • 2021-10-14
    • 1970-01-01
    • 2015-08-30
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多