2

HashMapの使用に関する性能について質問がありequalsます。ここに示すように、最初に null チェックを入れると、次のようになります。

public boolean equals(final Object obj) {
    // object must be Test at this point
    if (obj == null) {
        return false;
    }
}

私がそうしなかった場合は、少し速くなるでしょう。

では、 を作成するには、HashMapの要素と比較して、どのような種類の要素を作成するのでしょうかHashMap。置く、挿入する、または取得するとき、nullオブジェクトを挿入することはありません。

ありがとう!

4

2 に答える 2

5

単一の if ステートメントのコストについて真剣に心配する必要はありません。これはマイクロ最適化であり、プログラムのボトルネックであるという証拠が文書化されていない限り、絶対に心配する必要はありません。ほとんどの場合、プログラムの速度低下は大規模な非効率性によるものであり、個別の if ステートメントによるものではありません。

そうは言っても、に格納されているオブジェクトはHashMap比較できますが、HashMapそれらを比較したいと考えています。これは通常、挿入、削除、およびルックアップ中に行われるため、 はHashMap2 つのオブジェクトが等しいかどうかを認識しますが、(オブジェクトは を通じて再配布されるためHashMap) 再ハッシュ中に行うこともできます。実装は、オブジェクトを比較してnullから、メモリ使用量を改善するために、ある種の非常に積極的なキャッシングまたは合体スキームを実行しようとすることさえあるかもしれません。の契約の一部はオブジェクトに対して機能する必要HashMapがあるため、実際には多くを想定することはできません。equals

nullさらに、 でサポートしていない場合はequals、で指定されているように の契約を破ってequalsObjectいることにnullなりますfalse。前述のように、これがボトルネックであることを示す検証可能なデータがない限り、これはほぼ間違いなく非常に悪い考えです。

お役に立てれば!

于 2013-01-21T06:32:53.847 に答える
3

最新のほとんどの CPU では、正しく分岐予測される null チェックは事実上無料です。真剣に、あなたはそれについて心配するべきではありません。

通常、この種の状況では最初にチェックを入れinstanceofますが、これにより null チェックは不要になります。

public boolean equals(final Object obj) {
    if (obj instanceof MyObject) {
        // do comparison
    } else {
        return false
    }
}

明示的な null チェックは必要ないことに注意してください。句は、有効なインスタンスelseではないものに対して false を返すのと同じ方法でこれを処理します。MyObject

于 2013-01-21T06:45:48.957 に答える