web-dev-qa-db-ja.com

HashMapに格納できるキー(オブジェクト)の数の理論的な制限は?

HashMapに格納できるキーエントリの数に理論的な制限はありますか、それとも純粋に使用可能なヒープメモリに依存していますか?

また、非常に多数のオブジェクト(たとえば、数十万のオブジェクト)を格納するのに最適なデータ構造はどれですか。

37
Ebbu Abraham

HashMapに格納できるキーエントリの数に理論的な制限はありますか、それとも純粋に使用可能なヒープメモリに依存していますか?

そのクラスのドキュメント を見ると、理論上の制限は_Integer.MAX_VALUE_(231-1 = 2147483647)要素。

これは、このクラスを適切に実装するために、 size() メソッドは、キーと値のペアの数を表すintを返す必要があるためです。

HashMap.size() のドキュメントから

戻り値:このマップ内のキーと値のマッピングの数

注:この質問は リストが最大で保持できるデータの数 とよく似ています。


非常に多数のオブジェクト(たとえば、数十万のオブジェクト)を格納するのに最適なデータ構造はどれですか?

保存する必要があるものと、必要なアクセスの種類によって異なります。すべての組み込みコレクションは、おそらく大量に最適化されています。

44
aioobe

HashMapは、配列に値を保持します。配列には、最大_Integer.MAX_VALUE_を保持できます。しかし、これは衝突を数えません。各Entryにはnextフィールドがあり、これもエントリです。これは、衝突(同じハッシュコードを持つ2つ以上のオブジェクト)が解決される方法です。だから私は(利用可能なメモリを除いて)制限があるとは言いません

_Integer.MAX_VALUE_を超えると、size()などの一部のメソッドから予期しない動作が発生しますが、get()およびput()は引き続き機能します。そして、オブジェクトのhashCode()intを返すため、それらは機能します。したがって、定義により、各オブジェクトはマップに適合します。そして、各オブジェクトは既存のオブジェクトと衝突します。

11
Bozho

@Bozhoに同意します。また、HashMapの Javadoc を注意深く読んでください。初期容量と負荷係数がどのように説明され、それらがHashMapのパフォーマンスにどのように影響するかに注意してください。

HashMapは、大量のデータセット(キーまたはメモリが不足しない限り)を保持するのに最適ですが、パフォーマンスが問題になる可能性があります。

単一のJava/JVMプログラムで必要なデータセットを操作できない場合は、分散キャッシュ/データグリッドを調べる必要がある場合があります。

0
Martijn Verburg

理論的な制限はありませんが、異なるエントリチェーン(異なるハッシュキーの下に保存)を保存するバケットの制限があります。この制限に達すると、新しい追加ごとにハッシュの衝突が発生しますが、これはパフォーマンス以外の問題ではありません...

0
pgras