1

Guava の ImmutableMap の javadoc には、次のように書かれています。

パフォーマンスに関する注意事項: HashMap とは異なり、ImmutableMap は、遅い Object.equals(java.lang.Object) または Object.hashCode() 実装を持つ要素タイプに対して最適化されていません。エレメント タイプに独自のハッシュ コードをキャッシュさせ、キャッシュされた値を使用して低速の equals アルゴリズムをショートサーキットすることにより、パフォーマンスを向上させることができます。

私の最初の質問は、要素の .equals または .hashCode の実装が遅いかどうかをどのように知ることができるかということです。私の特定のインスタンスでは、Java Enum をキーとして使用しているため、.equals と .hashCode の効率的なデフォルト実装がありますよね? (値の値を使用してマップにアクセスしない限り、値の実装は無関係であると思います。)

私の 2 番目の質問は、「エレメント タイプに独自のハッシュ コードをキャッシュさせる」ことの意味です。グーグルで調べてみると、あなたがそれをどのように行うかの例を見つけることができなかったようです. おそらく、ハッシュコード内のハッシュコードで終わることを意味すると思いますか? ハッシュコード バケットに入ると、.equals メソッドはその中で 2 番目のハッシュコード セットを使用しますか?

4

3 に答える 3

4

私は Java Enum をキーとして使用しているので、.equals と .hashCode の効率的なデフォルト実装がありますよね?

equals も hashcode もオーバーライドされないため、はるかに高速になることはほとんどありません (つまり、 equals returns this == other)。

私の 2 番目の質問は、「エレメント タイプに独自のハッシュ コードをキャッシュさせる」とはどういう意味ですか?

複数の計算を避けるために、以下のコードのようなものを使用できます。その場合は、次のことを確認する必要があります。

  • ハッシュコードは不変です (つまり、インスタンスの存続期間中は変更できません)。
  • あなたのhashcodeメソッドはスレッドセーフです(たとえば、ローカル変数を使用するか、より簡単にhash揮発性にすることで実行できます)。
class MyClass {
    private int hash;

    public int hashcode() {
        int hash = this.hash;
        if (hash == 0) {
            hash = calculateIt();
            this.hash = hash;
        }
        return hash;
    }
}
于 2013-03-16T21:20:57.233 に答える
2

キーが の場合、Enumこれは問題ではありません。

彼らがハッシュコードのキャッシュについて話していることは、次のようなものです。

private volatile int hashCode = -1;

@Override
public int hashCode() {
  if ( hashCode == -1 ) {
    hashCode = longCalculation();
  }
  return hashCode;
}
于 2013-03-16T21:20:03.600 に答える
0

これは非常に古い質問であることは知っていますが、私のようにここに来た人にとってEnumpMapは、キーが列挙型の場合、本当に を使用する必要があります。

于 2018-05-11T19:05:27.860 に答える