Java中的整数比较:Integer == Integer

在Java中,我们经常需要比较两个整数是否相等。在这个过程中,我们可能会遇到一些意外的结果。例如,下面的代码片段可能会让人困惑:

Integer a = 5;
Integer b = 5;
System.out.println(a == b);  // 输出true

Integer c = 128;
Integer d = 128;
System.out.println(c == d);  // 输出false

为什么在第一个比较中,a == b的结果是true,而在第二个比较中,c == d的结果是false呢?为了理解这个问题,让我们来探讨一下Java中的整数比较。

Java中的整数缓存

首先,我们需要知道的是,在Java中,整数对象是通过Integer类来表示的。尽管我们可以直接使用整数值进行比较,但实际上,每个整数都会被封装在一个Integer对象中。

为了提高性能,Java对一定范围的整数值进行了缓存。具体来说,Java缓存了在-128到127之间的整数对象。这意味着,当我们创建一个在这个范围内的整数对象时,实际上是从缓存中获取的,而不是每次都创建一个新的对象。

回到我们的代码片段,当我们创建ab时,它们的值都是5。由于5在缓存范围内,ab实际上指向了同一个对象,因此a == b的结果是true

整数对象比较的陷阱

然而,当我们创建cd时,它们的值是128。由于128不在缓存范围内,Java会为每个整数创建一个新的对象。因此,cd指向了两个不同的对象,尽管它们的值相同。

所以,当我们使用==运算符比较两个整数对象时,实际上比较的是对象的引用,即它们在内存中的地址是否相同。因此,c == d的结果是false

使用equals进行整数比较

为了避免上述陷阱,我们应该使用equals方法来比较整数对象的值。equals方法比较的是对象的值,而不是引用。因此,下面的代码将正确地比较整数对象的值:

Integer a = 5;
Integer b = 5;
System.out.println(a.equals(b));  // 输出true

Integer c = 128;
Integer d = 128;
System.out.println(c.equals(d));  // 输出true

使用equals方法比较整数对象的值是一种良好的编程实践,它可以避免因对象缓存而导致的意外结果。

类图

下面是整数缓存的类图,使用Mermaid语法表示:

classDiagram
    class Integer {
        - int value
        - static Integer[] cache
        + static Integer valueOf(int i)
    }

上面的类图展示了Integer类的结构。它包含一个私有的整数值value,以及一个静态的整数缓存cachevalue存储整数对象的值,cache用于缓存在-128到127之间的整数对象。

结论

通过本文,我们了解了在Java中比较整数对象的注意事项。我们学习了整数对象的缓存机制,以及使用equals方法进行整数比较的正确方式。希望本文能帮助你更好地理解Java中整数比较的原理,并避免因不正确的比较而导致的问题。

参考资料:

  • [Java Integer Cache](
  • [Java: Integer equals vs. ==](
  • [Java Integer Comparison](

**注意:本文