2017-01-06 7 views
1

あなたにはHashMapがあり、それは保持する要素の最大数を知っています(最大で、HashMap<EnumType, Integer> countPerEnumType;という列挙型を使用するので、exampleのため、最大要素数はEnumType.values().lengthとなります)。そのHashMapの初期容量と負荷率を指定しますか?何故なの)?要素の数が事前に分かっている場合は、HashMapの初期容量と負荷率を定義する必要がありますか?

負荷率が1になると思いますか? (安全?それとも?副作用で)

は、初期容量はHashMapのは、それがいっぱいになったとき、または展開されます lengthlength/loadFactor、または (length/loadFactor) + 1(すなわちだろうそれがいっぱいになり、次の要素がされようとしているとき?挿入されたあなたは、空のバケットのサイズ変更や無駄にメモリを防ぐために、ハッシュマップを設定する必要がありますどのように

EDIT:の例では、列挙型を使用し、Lew Bloch suggested EnumMap(私は質問を言い換えbeforte) - キーは列挙型ではないとしますが、要素の数はまだ分かっていますあなたは前もって終わるだろう?高性能のある

+0

列挙型の値はキーですか? – chrylis

+0

はい。ごめんなさい。私は 'HashMap 'が暗黙的に... ;-) – Christian

+1

を作成し、次に 'EnumMap'を使用すると考えました。 – chrylis

答えて

4

利用代わりEnumMapは、特に列挙型のキーのために設計されMap

Map<EnumType, Integer> counts = new EnumMap<>(); 
+0

ニースは、それは手元の特定の問題に役立ちます...:) – Christian

+0

どのように問題に合わないのですか? –

+0

要素数が事前に分かっている場合は、HashMapの初期容量と負荷率を定義する必要がありますか? enumsの言及はありません。 :) – Christian

0

私の理解そのプットがにマップの大きさの原因となります場合HashMapのは、put操作中にサイズを変更するということです初期容量に負荷率を掛けた値を超えている。

挿入すると予想される要素の数と等しい初期容量と1の負荷係数を持つようにHashMapを宣言すると、すべてのバケットが埋められ、バケットは無駄になりません。

+3

"すべてのバケットがいっぱいになる"、いいえ、まだハッシュの衝突がある可能性があります。 enumはデフォルトで 'Object'の' hashCode'を使用するためです。 –

+0

エントリの数が適度に遅い場合は、enumなどの型の衝突の確率は非常に低く、衝突が発生しても実際には有害ではありません。 –

関連する問題