优化equals()方法

Arm*_*llo 5 java performance equality equals

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

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

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

您还遇到了哪些可以成为编写表现良好equals()方法的指南?

Chr*_*cks 14

一些不一定具体的一般性想法 equals()

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

除了性能方面的考虑之外,不要忘记equalsAPI契约,以确保您的等式具有反身性,对称性,传递性一致性,并且在覆盖hashcode()时也始终覆盖equals().


Bil*_*ard 5

如何在Java中编写一个平等方法是一篇非常详细和写得很好的文章,解释了编写一个平等方法以及如何避免它们的常见缺陷.