HashMapに格納できるキーエントリの数に理論的な制限はありますか、それとも純粋に使用可能なヒープメモリに依存していますか?
また、非常に多数のオブジェクト(たとえば、数十万のオブジェクト)を格納するのに最適なデータ構造はどれですか。
HashMapに格納できるキーエントリの数に理論的な制限はありますか、それとも純粋に使用可能なヒープメモリに依存していますか?
そのクラスのドキュメント を見ると、理論上の制限は_Integer.MAX_VALUE
_(231-1 = 2147483647)要素。
これは、このクラスを適切に実装するために、 size()
メソッドは、キーと値のペアの数を表すint
を返す必要があるためです。
HashMap.size()
のドキュメントから
戻り値:このマップ内のキーと値のマッピングの数
注:この質問は リストが最大で保持できるデータの数 とよく似ています。
非常に多数のオブジェクト(たとえば、数十万のオブジェクト)を格納するのに最適なデータ構造はどれですか?
保存する必要があるものと、必要なアクセスの種類によって異なります。すべての組み込みコレクションは、おそらく大量に最適化されています。
HashMap
は、配列に値を保持します。配列には、最大_Integer.MAX_VALUE
_を保持できます。しかし、これは衝突を数えません。各Entry
にはnext
フィールドがあり、これもエントリです。これは、衝突(同じハッシュコードを持つ2つ以上のオブジェクト)が解決される方法です。だから私は(利用可能なメモリを除いて)制限があるとは言いません
_Integer.MAX_VALUE
_を超えると、size()
などの一部のメソッドから予期しない動作が発生しますが、get()
およびput()
は引き続き機能します。そして、オブジェクトのhashCode()
はint
を返すため、それらは機能します。したがって、定義により、各オブジェクトはマップに適合します。そして、各オブジェクトは既存のオブジェクトと衝突します。
@Bozhoに同意します。また、HashMapの Javadoc を注意深く読んでください。初期容量と負荷係数がどのように説明され、それらがHashMapのパフォーマンスにどのように影響するかに注意してください。
HashMapは、大量のデータセット(キーまたはメモリが不足しない限り)を保持するのに最適ですが、パフォーマンスが問題になる可能性があります。
単一のJava/JVMプログラムで必要なデータセットを操作できない場合は、分散キャッシュ/データグリッドを調べる必要がある場合があります。
理論的な制限はありませんが、異なるエントリチェーン(異なるハッシュキーの下に保存)を保存するバケットの制限があります。この制限に達すると、新しい追加ごとにハッシュの衝突が発生しますが、これはパフォーマンス以外の問題ではありません...