【微知识】Integer 类型比较大小的坑

本文发布于 2025年07月16日,阅读 3 次,点赞 0 次,归类于 微知识
【微知识】Integer 类型比较大小的坑

Integer 类型比较大小的“坑“。


by emanjusaka from https://www.emanjusaka.com/archives/java-Integer-equals 彼岸花开可奈何
本文为原创文章,可能会更新知识点以及修正文中的一些错误,全文转载请保留原文地址,避免产生因未即时修正导致的误导。

博客:https://www.emanjusaka.com
博客园:https://www.cnblogs.com/emanjusaka
公众号:emanjusaka的编程栈

Integer 作为包装类型是不能直接比较大小的,基本类型 int 可以使用 ==比较大小,Integer 类型并不能这么比较大小。

下面我将介绍几种遇到的"坑",记录一下以防再犯。

Integer类型比较大小的三种情况

1、操作数都是int类型

        int a = 10;
        int b = 10;
        System.out.println(a == b);

这个输出结果是true,当操作数都是int类型时,是可以用==进行大小比较的。

2、操作数都是Integer类型

        Integer a = 127;
        Integer b = 127;
        System.out.println(a == b);

这个输出结果是true

        Integer a = 128;
        Integer b = 128;
        System.out.println(a == b);

而这个输出结果是false

这是什么原因导致的问题呢?

Integer类型是包装类型,使用==比较大小实际是比较的它们的引用地址。

在 Java 中,Integer 类型存在一个缓存机制,即 Integer 缓存池(也称为 Integer 常量池),用于优化性能和减少内存占用。

默认情况下,Integer 缓存池的范围是 -128 到 127(包括两端的值)。

所以在缓存池的范围内的数,是直接使用缓存池的对象的。

127 使用缓存池,输出 true,因为指向同一个缓存对象。

128 超出缓存范围,创建新对象,输出 false,因为是不同的对象

还有两种另外初始化 Integer 的方式。

方式一:

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

方式二:

        Integer a = new Integer(127);
        Integer b = new Integer(127);
        System.out.println(a == b); // 输出 false

方式一和方式二的输出结果不同,这是因为使用 valueOf 方法会使用缓存,而使用 new 关键字会强制创建新对象,不使用缓存。

3、当操作数一个是int类型,另一个是Integer类型

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

当操作数一个是 int(基本数据类型),另一个是 Integer(包装类)时,Java 会触发自动拆箱机制,将 Integer 对象转换为 int 基本类型,然后再进行比较。

此时 == 比较的是数值本身,而不是引用地址。

Integer类型比较大小的正确方式

Integer类型应该怎样比较大小,下面介绍三种方式:

1、使用 equals() 方法

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

Integer 类重写了 equals() 方法,专门用于比较两个 Integer 对象的数值是否相等(而非引用地址)。

2、使用intValue() 方法手动拆箱

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

主动调用 intValue() 方法手动拆箱,会将 Integer 类型 拆箱成 int 类型,再用 == 比较数值是否相等。

3、使用compareTo() 方法

        Integer a = 200;
        Integer b = 200;
        System.out.println(a.compareTo(b) == 0); // 输出 true

在 Java 中,Integer 类实现了 Comparable<Integer> 接口,因此可以使用 compareTo() 方法来比较两个 Integer 对象的大小。这种方式既可以判断相等性,也能比较大小关系。

本篇完
下一篇: 为什么@Transactional不生效?Spring事务失效的排查手册