2012-02-20 12 views
3

このQA How does Java implement hash tables?は、HashtableがJavaで静的配列を使用して実装されていることを説明しています(静的配列はアイテムの総数に応じて洗練されます)。JavaがArrayListクラスを使用してHashtable/HashMapクラスを実装していないのはなぜですか?

JavaがArrayListなどの動的配列を使用してHashtableを実装しないのはなぜですか?

トレードオフは何ですか?

答えて

4

ハッシュテーブルのサイズを変更すると、すべてのエントリの位置を変更する必要があります。
したがって、ArrayListを使用すると、は遅いになります。これは、HashTableがすべてを再計算する前に、ArrayListが現在は役に立たない古い値をコピーするためです。

+0

ハッシュテーブルに{1、 "a"}があるとします(1は簡単のためにキーではなくキーのスロットインデックスです)。今度はHashtableを使う必要があるので、{1、 "a"}を{10、 "a"}に再ハッシュする必要があります。つまり、ペアをインデックス1からインデックス10にコピーする必要があります。少なくとも静的な生の配列より効率的ではないので、ArrayListを使用する意味がありません。あなたはこれを意味しますか? –

+0

いいえ、私の指摘は、ArrayListのサイズを変更すると元のデータが新しいバッキング配列にコピーされるということです。ハッシュテーブルはそれを望んでいません。 – SLaks

+0

ArrayListは動的配列なので、サイズを変更する必要がありますか? –

1

ハッシュテーブル内のすべてのアイテムを再ハッシュする必要があります。これは非常にコストがかかる操作で、現在配列内にあるアイテムの位置を無効にします。そのため、アイテム数が一定数を超えるたびに閾値(負荷率)。サイズ変更は内部的に管理され、既存の項目は新しい位置に移動する必要があるため、ArrayListのような「サイズ変更可能な配列」は意味をなさない。

0

実装クラスはかなり不透明です。 ArrayListは実際の静的配列と比較してむしろ不安定であるため、使用する必要はありません。

少なくとも、この方法では、ハッシュマップを含む静的配列へのラッパーを保存することはありません。

ArrayListのサイズを変更すると、HashMapのサイズ変更のようになります。両方とも静的な基本配列で動作するためですが、マップのすべての要素を再ハッシュして使用する必要はありません。

関連する問題