2009-07-22 18 views
5

equals()メソッドを最適化する(と同様に、compareTo()メソッドも)パフォーマンスのホットスポットになる可能性があります(たとえば、トラフィックが多い場合はHashMap)。私は、必要があると判明した場合に、これらの方法を最適化するために人々が採用したトリックを疑問に思っていました。equal()メソッド

のIntelliJ IDEAは、例えば、以下を生成します。あなたはそれに遭遇してきた他に何

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

    ... 
} 

は良い実行equals()方法を記述するための指針になることができますか?

答えて

14

できるだけ早期としてequals()

  • 失敗に必ずしも特定されていないいくつかの一般的なアイデア。あなたが投稿したスニペットと同様に、最も広範な除外基準から始めて、より細かくなるので、メソッドはできるだけ早く返すことができます。
  • 等価性のために必要な属性を比較してください。私は時々、クラスの提供する情報のすべての部分を比較していることがありますが、実際には2つのクラスインスタンスが等しいという意味の意味的役割を果たすのは少数の属性だけです。これはもちろんクラスとデザインに大きく依存します
  • 可能であれば、等価再帰を避けてください。。あなたが比較しているクラス属性の種類に応じて、非表示のパフォーマンスへの影響を持つことができますが、再帰的に自分自身や他のオブジェクトにequals()を呼び出している状況で、に自分自身を取得する可能性がありますパフォーマンスを考慮に加えて

、ドン」トンあなたの平等が再帰対称推移一貫であり、あなたがequals()をオーバーライドするときは、常に、同様hashcode()を上書きすることを確認するためにequals API contractを忘れます。

5

私はあなたが言ったので、あなたはそれの重要な部分にすでにだと思う:

を...彼らは必要なことを証明する場合。

最適化のための一般的なルールを覚えておいてください:

  1. は、私はそれらを聞いた

を最適化する前にいない...まだ

  • プロフィールを作成しないでください
  • ください何年も前のクラスで、私はC2と言えるほど近いです。

  • 2

    ジョシュア・ブロッホの著書「効果的なJava」をチェックしてください。それにはいくつかのすばらしいヒントとこの質問に関するセクションがあります。がんばろう!

    1

    string interningから手がかりを得ることができます。

    オブジェクトが不変の場合は、静的なファクトリメソッドを使用し、一意のインスタンスをハッシュテーブルに埋め込むことで、独自の「インターンシップ」を実装できます。これを行うと、参照が等しい場合、オブジェクトは等しくなります。

    +0

    同等の値で呼び出されたときに、同じインスタンスをハッシュテーブルから削除するというファクトリメソッドについて説明しておきます。 – devgeezer

    +1

    「介入」には注意が必要です。誤って実行されると、パフォーマンス上の問題やストレージリークが発生する可能性があります。実際、String.intern()を呼び出すのは悪い考えです。 –

    +0

    これは留意すべき注意事項です。私はEquals(...)が容認できないほど長い時間を取っているという確かな証拠がない限り、最適化のための私のアドバイスは、通常は他の場所に見えるでしょう。 – devgeezer

    1

    equals()の呼び出しを完全に制御できる環境にオブジェクトがある場合は、実行している比較の種類を追跡し、equals()メソッドを適切に調整する必要があります。

    あなたは、特定のシナリオは決して起こらないことを確認することができるかもしれない、そうequals()内にコードされている必要はありません、例えば:

    自己を比較し、異なる種類
  • を比較null
  • を比較

    あなたが実行するチェックの適切な順序を決定し、最も一般的でない失敗の理由をチェックすることもできますst。

  • 0

    ハッシュマップをより大きくすることはequals()が高価であることを推奨します(負荷係数を減らすなど)。そうすれば衝突が少なくなり、うまくいけばtrueが返ってくるのが最も頻繁に一致するでしょう。

    関連する問題