5

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

たとえば、IntelliJ IDEA は以下を生成します。

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

    ...
}

equals()他に、優れたパフォーマンスのメソッドを作成するためのガイドラインになり得るものはありますか?

4

7 に答える 7

14

必ずしも固有ではないいくつかの一般的なアイデアequals()

  • できるだけ早く失敗します。投稿したスニペットと同様に、最初に最も広範な除外基準から始めてから、より細かくして、メソッドができるだけ早く戻ることができるようにします
  • equality に必要な属性のみを比較します。2 つのクラス インスタンスの等価性に関して実際にセマンティックな役割を果たしているのはほんの一握りの属性だけであるにもかかわらず、クラスが提供するすべての情報を比較する人々を時々見てきました。もちろん、これはクラスとデザインに大きく依存します
  • 可能であれば、等価再帰を避けてくださいequals()比較しているクラス属性の種類によっては、自分自身または他のオブジェクトを再帰的に呼び出している状況に陥る可能性があり、パフォーマンスに隠れた影響を与える可能性があります

equalsパフォーマンスの考慮事項に加えて、 API コントラクトを忘れずに、等価性がreflexivesymmetrictransitive、および一貫hashcode()していることを確認し、オーバーライドするときに常にオーバーライドすることも忘れないでくださいequals()

于 2009-07-22T01:27:24.860 に答える
5

How to Write an Equality Method in Javaは、等値メソッドを作成する際の一般的な落とし穴とその回避方法を説明する、非常に詳細でよく書かれた記事です。

于 2009-07-22T02:59:41.263 に答える
4

あなたが言ったので、あなたはすでにその重要な部分に取り組んでいると思います:

...必要に応じて。

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

  1. しないでください
  2. しない... まだ
  3. 最適化前のプロファイル

私は何年も前にクラスでそれらを聞いたことがありますが、 C2がソースであると言えるほど近いものです。

于 2009-07-22T01:30:06.590 に答える
2

Joshua Bloch 著の「Effective Java」というタイトルの書籍を参照してください。いくつかの驚くべきヒントと、この質問に関するセクション全体があります。幸運を!

于 2009-07-22T01:40:37.123 に答える
1

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

特定のシナリオが発生しないことを確認できる場合があるためequals()、次のように 内でコード化する必要はありません。

  • 比較するnull
  • 異なるタイプの比較
  • 自分を比較する

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

于 2009-07-22T02:04:31.243 に答える
1

string interningからヒントを得られるかもしれません。

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

于 2009-07-22T01:41:02.673 に答える
0

HashMap を大きくすると equals() のコストが高くなることをお勧めします (たとえば、負荷係数を減らすことによって)。そうすれば、衝突が少なくなり、うまくいけば if(o == this) return true が最も頻繁に一致します。

于 2009-07-22T05:55:08.153 に答える