比较两个整数:为什么 == 为 true?

发布于 2024-12-02 18:43:33 字数 461 浏览 0 评论 0原文

可能的重复:
包装类和 == 运算符

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

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

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

}

Possible Duplicate:
Wrapper class and == operator

Hi when I am comparing Integer with == I have some problem so
can you explain me why second test is success too ?

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

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

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

眼泪也成诗 2024-12-09 18:43:33

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

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

除非您切换到 int ,否则您可以通过 prvni.intValue() 或使用 prvni.equals(...) 代替。

When using == to compare Objects, you're actually comparing the references. I.e., the reason both assertions are true is because the prvni and druhy refer to the same object while treti and ctvrty does not.

This is because the JVM caches Integer objects in the range -128 to 127, and reuses cached objects when autoboxing the values.

Unless you switch to int instead, you could go through prvni.intValue() or use prvni.equals(...) instead.

佼人 2024-12-09 18:43:33

从 Java 1.5 开始,一些包装类引入了缓存。对于Integer,-128 到 127 之间的任何数字(包含 -128 和 127)都会落入缓存中。其他值每次都需要包装在一个新的 Integer 中。

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

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

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

或者:

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

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

Since Java 1.5, some of the wrapper classes have introduced a cache. For Integer, any number between -128 and 127 inclusive fell in the cache. Other values needed to be wrapped in a new Integer every time.

The == operator compares references. Since the cached Integer values for 127 are in fact the very same object, == returns true. For the 128 Integer objects, they are two different objects and do not have the same reference equality.

There are two more reliable ways you can compare for equality:

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

or:

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

The latter comparison takes advantage of the fact that Integer implements the Comparable interface and thus defines a compareTo method which returns a negative value if the first object is "less than" the second, a positive value if the first object is "greater than" the second, and zero if the objects compare equal.

羞稚 2024-12-09 18:43:33

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

试试这个:

int treti = 128;
int ctvrty = 128;

The autoboxing feature creates a new instance for every object.

try this:

int treti = 128;
int ctvrty = 128;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文