equals()
方法(以及compareTo()
方法)可以成为性能热点(例如,在高流量HashMap
中)。我想知道人们在证明有必要时采取了哪些措施来优化这些方法。
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
...
}
您还有哪些其他方法可以成为撰写效果良好的equals()
方法的指南?
答案 0 :(得分:14)
一些不一定特定于equals()
equals()
的情况,这会对性能产生隐藏影响除性能方面的考虑外,不要忘记equals
API contract以确保您的等式自反,对称,传递和一致并在覆盖hashcode()
时始终覆盖equals()
。
答案 1 :(得分:5)
How to Write an Equality Method in Java是一篇非常详细且写得很好的文章,解释了编写平等方法以及如何避免它们的常见缺陷。
答案 2 :(得分:4)
我认为你已经把它放在了关键部分,因为你说:
......当证明有必要时。
请记住优化的一般规则:
几年前我在课堂上听过他们,我尽可能地知道C2是来源。
答案 3 :(得分:2)
查看Joshua Bloch撰写的“Effective Java”一书。它有一些惊人的提示和关于这个问题的整个部分。古德勒克!
答案 4 :(得分:1)
您可以从string interning获取提示。
如果您的对象是不可变的,您可以通过使用静态工厂方法并将唯一实例填充到哈希表中来实现自己的“实习”。如果这样做,那么当引用相等时,对象是相等的。
答案 5 :(得分:1)
如果您的对象位于您可以完全控制对其调用equals()
的内容的环境中,那么您应该跟踪您正在执行的比较类型,并适当调整equals()
方法
您可以确认某些情况永远不会发生,因此不需要在equals()
内进行编码,例如:
null
您还可以决定执行检查的适当顺序,首先检查最常见的失败原因。
答案 6 :(得分:0)
我建议将HashMap设置得更大等于()是昂贵的(例如通过降低负载系数)。这样你就会有更少的碰撞,希望如果(o == this)返回true将最常匹配。