0

タイトルの通り - HashMap が保持できる要素の数を制限するものと、代わりに使用できるデータ構造。

4

6 に答える 6

2

a の代わりにhashCodean を返すという事実も、 2^32 エントリをはるかに超える効率性を妨げます。intlongHashMap

于 2012-10-03T16:59:04.980 に答える
1

1つは、最大配列サイズです。これは、JavaではですInteger.MAX_VALUE

HashMapそれが制限である場合は、オブジェクトのリストをラップする独自のクラスを作成するか、を使用できますLinkedHashMap

于 2012-10-03T16:56:25.250 に答える
0

データ構造は、内部のHashMapハッシュテーブルの配列によって支えられています。Java配列のサイズは整数を使用して指定する必要があるため、サイズはInteger.MAX_VALUE(約20億要素)に制限されています。

より多くの要素の一定時間のルックアップが必要な場合は、ネストされたHashMapsを独自のクラス定義でラップできると思いますが、JavaのCollectionインターフェイスがintサイズ値を指定しているという事実を回避する必要もあります-簡単に言えば、複数の要素を格納するデータ構造を持つことは可能ですが、これはインターフェイスInteger.MAX_VALUEのどの部分でも実際にはサポートされていません。Collection

于 2012-10-03T17:02:43.100 に答える
0

すでに述べたヒープサイズを除いて、HashMapに配置できるアイテムの数に厳しい制限はないと思います。

内部的には、HashMapsには「バケット」の配列があり、各バケットはリンクリストです。アイテムを追加すると、正しいバケットを見つけるためにハッシュされ、リンクリストの先頭に追加されます。そのため、すべてのバケットに1つのアイテムが含まれている場合でも、アイテムをもう1つ追加すると、バケット内のリンクリストにアイテムが追加されます。

上記で説明した動作は、Oracle JREに付属するHashMapクラスの実装であり、他のプラットフォームでは異なる場合があるため、他のプラットフォームでは、配置できるアイテムの数に制限がある場合があります。

また、Integer.MAX_VALUEを超えるアイテムをHashMapに配置すると、アイテムを検索するときにHashMapがリストを反復処理する必要があるため、ルックアップのパフォーマンスが大幅に低下することも指摘しておく価値があります。

于 2012-10-03T17:03:36.053 に答える
0

唯一の制約は、配列サイズ(2 ^ 31-1)と、キータイプで可能な一意の値の数です。

于 2012-10-03T16:57:17.763 に答える
0

特に制限はないと思います。

まず、最大の int 値が最大の配列サイズを与えるため、オブジェクトの hashCode は常に最大の配列サイズに収まります。

第二に、HashMap はキーにリストを使用します。したがって、2 つのキーが同じ hashCode を持っている場合 (一部の値のみを挿入した場合でも発生する可能性があります)、いずれにせよ挿入されます。リストは好きなだけ長くできるので、その効率以外に実際の制限はありません。

于 2012-10-03T17:00:28.340 に答える