重写 equals() 才能比较内容,需先判引用、空值和类型,再用 objects.equals 比较字段;必须配套重写 hashcode(),数组用 arrays.equals/deepequals,避免 null 用 objects.equals。

直接用 equals() 方法,但前提是这个方法已被正确重写;否则默认行为等同于 ==,只比地址,不比内容。
必须重写 equals() 才能比较内容
Object 类自带的 equals() 就是用 == 实现的。如果没重写,哪怕两个对象所有字段值都一样,obj1.equals(obj2) 也会返回 false。
- 重写时先判断
this == obj(引用相同直接 true) - 再检查
obj == null或类型不匹配(避免空指针和类型转换异常) - 最后逐个比较关键字段:基本类型用
==,引用类型用Objects.equals(a, b)(自动处理 null)
配套重写 hashCode() 是硬性要求
只要重写了 equals(),就必须重写 hashCode(),否则放进 HashMap、HashSet 会出现逻辑错误——比如两个 equals() 返回 true 的对象,却无法在集合中被正确查找到。
- 推荐用
Objects.hash(field1, field2, ...)生成哈希码 - 参与
hashCode()计算的字段,必须和equals()中用于判断相等的字段完全一致
数组字段要单独处理
如果对象里有数组类型的字段(如 int[] scores 或 String[] tags),不能用 == 或 .equals() 直接比,得调用 Arrays.equals(arr1, arr2)(一维)或 Arrays.deepEquals(arr1, arr2)(嵌套数组)。
- 例如:
Objects.equals(this.tags, that.tags)对String[]无效,应改为Arrays.equals(this.tags, that.tags) - 二维数组必须用
deepEquals,否则只是比较子数组的引用
用 Objects.equals() 简化判空逻辑
自己写 equals() 时,别手动写 a != null && a.equals(b) 这种容易漏 null 的判断。直接用 Objects.equals(a, b),它内部已安全处理所有 null 情况。
- 效果等价于:
a == b || (a != null && a.equals(b)) - 尤其适合比较字符串、包装类、自定义对象等可能为 null 的字段
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











