代码之家  ›  专栏  ›  技术社区  ›  Armadillo

优化equals()方法

  •  5
  • Armadillo  · 技术社区  · 16 年前

    这个 equals() 方法(也就是说, compareTo() 方法)可以成为性能热点(例如在高流量情况下) HashMap )我想知道,当人们证明有必要时,他们采用了哪些技巧来优化这些方法。

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

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

    你还发现了什么可以作为写一篇好文章的指导方针 等式() 方法?

    7 回复  |  直到 16 年前
        1
  •  14
  •   Christian Hang-Hicks    16 年前

    equals()

    • . 与您发布的代码片段类似,首先从最广泛的排除条件开始,然后变得更细粒度,以便该方法能够尽快返回
    • .我有时会看到人们比较一个类提供的每一条信息,即使只有少数属性实际上在两个类实例的相等性中起到了语义作用。当然,这很大程度上取决于你的班级和设计
    • 对您自己或其他对象有潜在性能影响

    equals API contract hashcode() 当你重写

        2
  •  5
  •   Bill the Lizard    16 年前

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

        3
  •  4
  •   dustmachine    16 年前

    我认为你已经进入了其中的一个关键部分,因为你说:

    记住优化的一般规则:

    C2 是源头。

        4
  •  2
  •   Danny    16 年前

    请查阅Joshua Bloch的一本书“有效Java”。它有一些惊人的提示和关于这个问题的整个部分。祝你好运!

        5
  •  1
  •   devgeezer    16 年前

    string interning .

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

        6
  •  1
  •   Stephen Denne    16 年前

    如果您的对象位于完全控制调用的环境中 equals()

    您可能能够确认某些场景永远不会发生,因此不需要在

    • null
    • 比较不同类型

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

        7
  •  0
  •   Peter Lawrey    16 年前

    我建议将hashmap变大is equals()是很昂贵的(例如通过降低加载因子)。这样您的冲突就更少了,并且希望如果(o==this)返回true,则最常匹配。