包装类的equals()比较值是否相等,==比较引用是否相同或自动拆箱后值是否相等;equals()先判空再判类型最后比数值,==在缓存范围内可能因对象复用返回true,超出范围通常false。

包装类(如 Integer、Boolean、Double 等)的 equals() 和 == 看似都在“比较相等”,但行为完全不同:前者比的是**值是否相等**,后者比的是**引用是否指向同一对象(或自动拆箱后值是否相等)**——关键在于是否发生自动拆箱,以及对象是否来自缓存池。
== 比较:地址优先,拆箱是例外
对两个包装类引用使用 == 时:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 若两边都是引用类型(如 Integer a = new Integer(100); Integer b = new Integer(100);),则比较内存地址 → 结果为 false
- 若其中一边是基本类型(如 Integer a = 100; int b = 100;),Java 自动拆箱 → 实际执行 a.intValue() == b → 结果为 true
- 若两边都是常量赋值且在缓存范围内(如 Integer a = 127; Integer b = 127;),JVM 复用缓存对象 → 地址相同 → true;但超出范围(如 Integer a = 128; Integer b = 128;)→ 通常为 false(取决于实现,但不建议依赖)
equals() 比较:始终比值,但要求非 null
equals() 是 Object 继承来的方法,包装类都重写了它,逻辑统一为:
- 先判空(if (obj == null) return false;)
- 再判断类型是否匹配(如 obj instanceof Integer)
- 最后比较实际数值(如 this.value == ((Integer)obj).value)
- 所以 new Integer(100).equals(new Integer(100)) 是 true,哪怕对象不同
- 注意:null.equals(someInteger) 会抛 NullPointerException,而 someInteger.equals(null) 安全返回 false
常见陷阱与建议
- 永远别用 == 判断两个包装类引用的“业务相等性”——结果不可靠(受缓存、构造方式影响)
- 比较值是否相等,一律用 equals();需要确保安全,可写成 Objects.equals(a, b)(自动处理 null)
- 如果明确要判断是否是同一个对象(极少见),才用 ==;日常开发中几乎不需要
- 浮点数包装类(Float、Double)的 equals() 对 NaN 有特殊处理:Float.NaN.equals(Float.NaN) 返回 true,而 Float.NaN == Float.NaN 是 false
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










