Java中Integer封装:100和1000的相等性之谜

8,965次阅读
没有评论

共计 1544 个字符,预计需要花费 4 分钟才能阅读完成。

一语呢喃醉
2024-02-02 09:57:43
浏览数 (2381)

在 Java 中,Integer 封装类的相等性比较常常让人感到困惑。为什么当我们比较 100 和 100 时,结果为 true,但比较 1000 和 1000 时,结果却为 false?这个现象涉及到 Java 的整数缓存和对象引用的差异。在本文中,我们将揭示这个有趣的现象的原因,并解释如何正确比较整数封装类的相等性。

下载 (1)

在 Java 中,对于整数类型的封装类 Integer,我们经常会遇到一个有趣的现象:当比较两个小整数相等性时,例如 100 和 100,结果为​true​;但当比较两个大整数相等性时,例如 1000 和 1000,结果却为​false​。这种现象背后隐藏着 Java 中整数对象缓存和对象引用的一些细微差别。

public class Main {public static void main(String[] args) {
        Integer a = 1000;
        Integer b = 1000;
        System.out.println(a == b);

        Integer c = 100;
        Integer d = 100;
        System.out.println(c == d);
    }
}
/**
 * 运行结果
 * false
 * true
 */

为了提高性能和节省内存,Java 在内部维护了一个整数缓存池,范围是 -128 到 127。当我们创建一个 Integer 对象时,如果数值在这个范围内,Java 会尝试从缓存池中获取已经存在的 Integer 对象。这样,当我们使用相同数值的两个 Integer 对象进行比较时,它们实际上是同一个对象的引用,因此比较结果为​true​。这种情况下,我们可以说它们是相等的。

然而,当整数超出了缓存池的范围,例如 1000,Java 会在堆中创建新的 Integer 对象,而不是从缓存池中获取。尽管它们的数值相同,但它们在内存中是不同的对象,具有不同的引用。因此,当我们比较两个大整数的相等性时,由于比较的是对象的引用而不是数值本身,结果为​false​。

Snipaste_2024-02-02_09-45-17

这种行为可以通过 Java 的自动装箱(Autoboxing)和拆箱(Unboxing)机制来解释。当我们使用​==​运算符比较两个 Integer 对象时,实际上是在比较它们的引用,而不是数值。如果我们想要比较它们的数值是否相等,应该使用​equals()​方法,因为在 Integer 类中,​equals()​方法被重写以进行数值的比较。

public class Main {public static void main(String[] args) {
        Integer a = 1000;
        Integer b = 1000;
        System.out.println(a.equals(b));

        Integer c = 100;
        Integer d = 100;
        System.out.println(c == d);
    }
}
/**
 * 运行结果
 * true
 * true
 */

需要注意的是,这种整数缓存的行为只适用于整数类型的封装类 Integer,而不适用于其他封装类如 Long、Double 等。

为了避免这种混淆和潜在的错误,我们应该始终使用​equals()​方法来比较两个封装类的相等性,尤其是在使用自动装箱和拆箱的情况下。此外,如果我们需要比较大整数的相等性,建议使用​equals()​方法或将整数转换为基本数据类型进行比较。

总结

Java 中的整数封装类 Integer 存在一个缓存池,对于 -128 到 127 之间的整数,它们是同一个对象的引用,因此比较结果为 true;对于超出该范围的整数,它们是不同的对象,比较结果为 false。这是由于自动装箱和对象引用的特性所导致的,我们应该谨慎使用 == 运算符来比较封装类的相等性,而是使用 equals() 方法来进行数值的比较。

原文地址: Java 中 Integer 封装:100 和 1000 的相等性之谜

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-09-19发表,共计1544字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)