タイトルの通り - HashMap が保持できる要素の数を制限するものと、代わりに使用できるデータ構造。
6 に答える
a の代わりにhashCode
an を返すという事実も、 2^32 エントリをはるかに超える効率性を妨げます。int
long
HashMap
1つは、最大配列サイズです。これは、JavaではですInteger.MAX_VALUE
。
HashMap
それが制限である場合は、オブジェクトのリストをラップする独自のクラスを作成するか、を使用できますLinkedHashMap
。
データ構造は、内部のHashMap
ハッシュテーブルの配列によって支えられています。Java配列のサイズは整数を使用して指定する必要があるため、サイズはInteger.MAX_VALUE
(約20億要素)に制限されています。
より多くの要素の一定時間のルックアップが必要な場合は、ネストされたHashMap
sを独自のクラス定義でラップできると思いますが、JavaのCollection
インターフェイスがint
サイズ値を指定しているという事実を回避する必要もあります-簡単に言えば、複数の要素を格納するデータ構造を持つことは可能ですが、これはインターフェイスInteger.MAX_VALUE
のどの部分でも実際にはサポートされていません。Collection
すでに述べたヒープサイズを除いて、HashMapに配置できるアイテムの数に厳しい制限はないと思います。
内部的には、HashMapsには「バケット」の配列があり、各バケットはリンクリストです。アイテムを追加すると、正しいバケットを見つけるためにハッシュされ、リンクリストの先頭に追加されます。そのため、すべてのバケットに1つのアイテムが含まれている場合でも、アイテムをもう1つ追加すると、バケット内のリンクリストにアイテムが追加されます。
上記で説明した動作は、Oracle JREに付属するHashMapクラスの実装であり、他のプラットフォームでは異なる場合があるため、他のプラットフォームでは、配置できるアイテムの数に制限がある場合があります。
また、Integer.MAX_VALUEを超えるアイテムをHashMapに配置すると、アイテムを検索するときにHashMapがリストを反復処理する必要があるため、ルックアップのパフォーマンスが大幅に低下することも指摘しておく価値があります。
唯一の制約は、配列サイズ(2 ^ 31-1)と、キータイプで可能な一意の値の数です。
特に制限はないと思います。
まず、最大の int 値が最大の配列サイズを与えるため、オブジェクトの hashCode は常に最大の配列サイズに収まります。
第二に、HashMap はキーにリストを使用します。したがって、2 つのキーが同じ hashCode を持っている場合 (一部の値のみを挿入した場合でも発生する可能性があります)、いずれにせよ挿入されます。リストは好きなだけ長くできるので、その効率以外に実際の制限はありません。