重写equals()方法必须满足对称性、自反性、传递性、一致性,并正确处理null和类型安全;高效做法是:先用==做null和引用相等检查,再用getclass()校验类型,然后按开销由小到大逐字段比较,最后同步重写hashcode()。

重写 equals() 方法必须同时满足 对称性、自反性、传递性、一致性,并正确处理 null 和类型安全;高效的关键在于 快速失败判断顺序 和 避免冗余计算。
1. 先做 null 和引用相等的快速检查
这是最廉价的判断,应放在最前面:
- 用
==判断是否为同一对象(包括null == null成立) - 立即返回
false如果参数为null(避免后续 NPE)
2. 使用 getClass() 做运行时类型校验(非 instanceof)
保证对称性和 Liskov 替换原则:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
getClass() != obj.getClass()→ 返回false - 不用
instanceof,否则子类equals()可能对父类对象返回true,破坏对称性 - 例如:
new Student().equals(new Person())应为false,即使 Student 继承 Person
3. 强转后逐字段比较,按“开销由小到大”排序
提升平均性能,减少不必要的昂贵操作:
- 先比基本类型(
int,boolean等,直接==) - 再比不可变引用类型(如
String、包装类),用Objects.equals(a, b)安全处理null - 最后比集合、数组、自定义对象等——调用其
equals()或用Arrays.equals()/Objects.equals() - 避免在
equals()中调用可能触发计算或 I/O 的方法(如 getter 内含逻辑)
4. 必须同步重写 hashCode()
违反该约定会导致哈希集合(HashMap, HashSet)行为异常:
- 所有参与
equals()比较的字段,也必须参与hashCode()计算 - 推荐用
Objects.hash(field1, field2, ...)生成哈希值 - 确保两个对象
equals()返回true时,它们的hashCode()一定相等
equals() 和 hashCode(),勾选 “Use getters”、“Non-null fields only” 等选项前需确认语义是否匹配业务需求。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










