优化equals()方法

时间:2009-07-22 01:21:04

标签: java performance equals equality

equals()方法(以及compareTo()方法)可以成为性能热点(例如,在高流量HashMap中)。我想知道人们在证明有必要时采取了哪些措施来优化这些方法。

例如,IntelliJ IDEA生成以下内容:

public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    ...
}

您还有哪些其他方法可以成为撰写效果良好的equals()方法的指南?

7 个答案:

答案 0 :(得分:14)

一些不一定特定于equals()

的一般性想法
  • 尽早失败。与您发布的代码段类似,首先从最广泛的排除条件开始,然后变得更细粒度,以便该方法可以尽快返回
  • 仅比较相等所需的属性。我有时会看到人们比较一个类提供的每一条信息,即使只有少数属性实际上为两个类实例的相等性起了语义作用。这当然在很大程度上取决于你的课程和设计
  • 尽可能避免等式递归。根据您要比较的类属性类型,您可能会遇到以递归方式对自己或其他对象调用equals()的情况,这会对性能产生隐藏影响

除性能方面的考虑外,不要忘记equals API contract以确保您的等式自反对称传递一致并在覆盖hashcode()时始终覆盖equals()

答案 1 :(得分:5)

How to Write an Equality Method in Java是一篇非常详细且写得很好的文章,解释了编写平等方法以及如何避免它们的常见缺陷。

答案 2 :(得分:4)

我认为你已经把它放在了关键部分,因为你说:

  

......当证明有必要时。

请记住优化的一般规则:

  1. 不要
  2. 不要......但
  3. 优化前的配置文件
  4. 几年前我在课堂上听过他们,我尽可能地知道C2是来源。

答案 3 :(得分:2)

查看Joshua Bloch撰写的“Effective Java”一书。它有一些惊人的提示和关于这个问题的整个部分。古德勒克!

答案 4 :(得分:1)

您可以从string interning获取提示。

如果您的对象是不可变的,您可以通过使用静态工厂方法并将唯一实例填充到哈希表中来实现自己的“实习”。如果这样做,那么当引用相等时,对象是相等的。

答案 5 :(得分:1)

如果您的对象位于您可以完全控制对其调用equals()的内容的环境中,那么您应该跟踪您正在执行的比较类型,并适当调整equals()方法

您可以确认某些情况永远不会发生,因此不需要在equals()内进行编码,例如:

  • 比较null
  • 比较不同类型
  • 比较自我

您还可以决定执行检查的适当顺序,首先检查最常见的失败原因。

答案 6 :(得分:0)

我建议将HashMap设置得更大等于()是昂贵的(例如通过降低负载系数)。这样你就会有更少的碰撞,希望如果(o == this)返回true将最常匹配。