Java中Integer.equals的用法与特殊情况

 更新时间:2025年07月14日 10:08:53   作者:清河大善人  
Java中Integer.equals比较数值而非对象地址,自动装箱处理int参数,-128~127范围内使用==安全,超出范围或null需用Objects.equals,compareTo用于大小比较,equals仅判断相等性,注意类型不匹配会导致false

在 Java 中,Integer.equalsInteger 类的一个方法,用于比较两个 Integer 对象的值是否相等。虽然它看起来很简单,但在某些情况下可能会出现意想不到的行为。

本文将深入剖析 Integer.equals 的工作原理,并探讨可能出现的特殊情况。

1.Integer.equals的基本规则

Integer 继承自 Number 类,并重写了 equals 方法,源码如下:

@Override
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return this.intValue() == ((Integer) obj).intValue();
    }
    return false;
}

规则解析:

  • 首先检查 obj 是否是 Integer 实例,如果不是,直接返回 false
  • 如果是 Integer,则比较其 int 值(intValue())。

示例:

Integer a = 1000;
Integer b = 1000;
System.out.println(a.equals(b)); // true,因为 1000 == 1000

尽管 ab 可能是不同的对象(因为 1000 超出了 Java 缓存范围),但 equals 只比较 ,所以返回 true

2.Integer.equals(int)的装箱问题

Integer.equals 方法中,参数 Object obj 可能是 自动装箱 过来的 Integer,也可能是直接传入的 int

Java 提供了 自动装箱(Autoboxing) 机制,会将基本类型 int 转换成 Integer

示例:

Integer a = 1000;
System.out.println(a.equals(1000)); // true

发生了什么?

  • 1000int,但 equals(Object obj) 需要 Object,所以 1000 先被 自动装箱Integer.valueOf(1000)
  • a.equals(Integer.valueOf(1000)),进入 equals 方法后,objInteger 实例,因此比较 intValue(),返回 true

特殊情况:

Integer a = 1000;
System.out.println(a.equals(1000.0)); // false
  • 1000.0double,不会被装箱为 Integerobj instanceof Integer 返回 false,所以 equals 直接返回 false

3.==vsequals()

示例:

Integer x = 100;
Integer y = 100;
System.out.println(x == y); // true
System.out.println(x.equals(y)); // true

Integer a = 1000;
Integer b = 1000;
System.out.println(a == b); // false
System.out.println(a.equals(b)); // true

为什么100和1000处理不同?

  • Java 对 -128 ~ 127 之间的 Integer 进行了缓存(Integer Cache),相同数值的 Integer 会共享同一个对象,== 也成立。
  • 超过 127 的数值 不在缓存范围内,Integer.valueOf(1000) 会创建新对象,所以 == 比较的是不同的对象地址,返回 false

如何正确判断 Integer 相等?

  • 推荐使用 equals,避免缓存带来的困惑
Integer a = 1000;
Integer b = 1000;
System.out.println(a.equals(b)); // true(比较的是值)
  • 不要直接用 ==,可能会出问题:
Integer a = 1000;
Integer b = 1000;
System.out.println(a == b); // false(因为是不同的对象)

4.null处理

示例:

Integer a = null;
System.out.println(a.equals(1000)); // 运行时报错:NullPointerException

如果 anull,那么调用 a.equals() 时会发生 NullPointerException

因此,在比较 Integer 时,建议使用 Objects.equals() 来防止空指针异常:

Integer a = null;
System.out.println(Objects.equals(a, 1000)); // false,不会报错

Objects.equals(a, b) 的实现相当于:

(a == b) || (a != null && a.equals(b))

这样就能避免 null.equals() 造成的异常。

5.equals()与compareTo()的区别

Integer 中,compareTo() 也是一个常见的比较方法:

Integer a = 1000;
Integer b = 2000;
System.out.println(a.compareTo(b)); // -1(1000 小于 2000)
System.out.println(b.compareTo(a)); // 1(2000 大于 1000)
System.out.println(a.compareTo(1000)); // 0(相等)

区别:

equals() 只返回 true/false,用于判断 相等性

compareTo() 返回:

  • 负数this < other
  • 0this == other
  • 正数this > other

6. 总结

情况代码示例结果原因
equals() 比较两个 Integernew Integer(1000).equals(new Integer(1000))✅ true比较的是数值
equals() 直接比较 intInteger.valueOf(1000).equals(1000)✅ true1000 先装箱为 Integer(1000),再比较值
equals() 与 DoubleInteger.valueOf(1000).equals(1000.0)❌ false1000.0 是 Double,equals() 只支持 Integer
== 比较 Integer(缓存范围内)Integer x = 100; Integer y = 100; x == y✅ true-128 ~ 127 之间 Integer 复用同一对象
== 比较 Integer(超出缓存范围)Integer a = 1000; Integer b = 1000; a == b❌ false1000 超出缓存范围,创建的是两个对象
null.equals()Integer a = null; a.equals(1000);❌ 抛异常a 为 null,调用 equals() 报 NullPointerException
Objects.equals()Objects.equals(null, 1000);✅ false避免 null 异常

Integer.equals(Object obj) 只比较值,不管对象地址。

Integer-128 ~ 127 之间的值会被缓存,超出范围的 Integer 不能用 == 比较。

如果 Integer 可能为 null,用 Objects.equals(a, b) 避免空指针异常。

Integer.equals(Double) 直接返回 false,不会自动转换类型。

compareTo() 适用于大小比较,而 equals() 只判断相等性。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java8 Stream collect(Collectors.toMap())的使用

    Java8 Stream collect(Collectors.toMap())的使用

    这篇文章主要介绍了Java8 Stream collect(Collectors.toMap())的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • MyBatis利用拦截器实现数据脱敏详解

    MyBatis利用拦截器实现数据脱敏详解

    现代网络环境中,敏感数据的处理是至关重要的,敏感数据包括个人身份信息、银行账号、手机号码等,所以本文主要为大家详细介绍了MyBatis如何利用拦截器实现数据脱敏,希望对大家有所帮助
    2023-11-11
  • Java/Spring项目的包开头为什么是com详解

    Java/Spring项目的包开头为什么是com详解

    这篇文章主要介绍了Java/Spring项目的包开头为什么是com的相关资料,在Java中包命名遵循域名反转规则,即使用公司的域名反转作为包的前缀,以确保其全球唯一性和避免命名冲突,这种规则有助于逻辑分层、代码可读性提升和标识代码来源,需要的朋友可以参考下
    2024-10-10
  • SpringBoot配置多数据源的四种方式分享

    SpringBoot配置多数据源的四种方式分享

    在日常开发中我们都是以单个数据库进行开发,在小型项目中是完全能够满足需求的,但是,当我们牵扯到大型项目的时候,单个数据库就难以承受用户的CRUD操作,那么此时,我们就需要使用多个数据源进行读写分离的操作,本文就给大家介绍SpringBoot配置多数据源的方式
    2023-07-07
  • springboot实现浏览器截屏并添加文字

    springboot实现浏览器截屏并添加文字

    大家好,本篇文章主要讲的是springboot实现浏览器截屏并添加文字,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Rabbitmq延迟队列实现定时任务的方法

    Rabbitmq延迟队列实现定时任务的方法

    这篇文章主要介绍了Rabbitmq延迟队列实现定时任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • spring6+JDK17实现SSM起步配置文件

    spring6+JDK17实现SSM起步配置文件

    本文介绍了使用Spring6和JDK17配置SSM(Spring + Spring MVC + MyBatis)框架,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • Java基本数据类型和运算符详解

    Java基本数据类型和运算符详解

    这篇文章主要介绍了Java基本数据类型和运算符,结合实例形式详细分析了java基本数据类型、数据类型转换、算术运算符、逻辑运算符等相关原理与操作技巧,需要的朋友可以参考下
    2020-02-02
  • java 数据结构之删除链表中的元素实例代码

    java 数据结构之删除链表中的元素实例代码

    这篇文章主要介绍了java 数据结构之删除链表中的元素实例代码的相关资料,需要的朋友可以参考下
    2017-01-01
  • Java实现文件点击没反应的方法

    Java实现文件点击没反应的方法

    jsp页面链接,点击访问action用IO流去下载服务器上的文件,问题是任凭怎么点击都没反应,日志也不报错。这篇文章给大家介绍Java实现文件点击没反应的方法,需要的朋友参考下吧
    2018-07-07

最新评论