モジュール java.base
パッケージ java.util

クラスHashtable<K,V>

java.lang.Object
java.util.Dictionary<K,V>
java.util.Hashtable<K,V>
型パラメータ:
K - このマップで保持されるキーの型
V - マップされる値の型
すべての実装されたインタフェース:
Serializable, Cloneable, Map<K,V>
直系の既知のサブクラス:
Properties, UIDefaults

public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
このクラスは、ハッシュ表(キーを値にマップ)を実装します。 nullオブジェクト以外であれば、どのオブジェクトでもキーや値に使用することができます。

ハッシュ表にオブジェクトを格納したり、そこから取り出したりするには、キーとして使用するオブジェクトに、hashCodeメソッドとequalsメソッドが実装されていなければなりません。

Hashtableのインスタンスには、その性能に影響を与える2つのパラメータである初期容量および負荷係数があります。 容量はハッシュ表のバケット数であり、初期容量は単純にハッシュ表が作成された時点での容量です。 ハッシュ表はオープンであることに注意してください。「ハッシュの衝突」という、1つのバケットが複数のエントリを格納する現象があり、その場合それらのエントリはシーケンシャル・サーチされることになります。 負荷係数は、ハッシュ表がどの程度いっぱいになると、その容量が自動的に増加されるかの基準です。 初期容量と負荷係数パラメータは、実装のヒントに過ぎません。 rehashメソッドがいつ呼び出されるか、および呼び出されるかどうかは、実装により異なります。

通常、デフォルトの負荷係数(.75)では、時間コストとスペース・コストの釣合いを取ります。 値を大きくすると領域のオーバーヘッドは減少しますが、エントリ(getputなど、ほとんどのHashtable操作に反映されます)の検索にかかる時間が長くなります。

初期容量により、浪費スペースと(時間のかかる) rehashオペレーションの需要との間の釣合いが制御されます。 初期容量が、Hashtableに含まれる最大エントリ数をその負荷係数で除算した場合、rehash操作は「永遠」になりません。 ただし、初期容量を高く設定しすぎると、スペースの浪費になります。

Hashtableに多くのエントリを入れる場合は、この表を十分に大きな容量で作成する方が、必要に応じてハッシュを自動的にやり直して表を大きくするよりも、エントリを効率的に挿入することができます。

この例は、数値のハッシュ表を作成します。 この例では、数値の名前をキーとして使います。

   
   Hashtable<String, Integer> numbers
     = new Hashtable<String, Integer>();
   numbers.put("one", 1);
   numbers.put("two", 2);
   numbers.put("three", 3);

数値を取り出すには、次のコードを使います。

   
   Integer n = numbers.get("two");
   if (n != null) {
     System.out.println("two = " + n);
   }

このクラスの"コレクション表示メソッド"のすべてによって返されるコレクションのiteratorメソッドによって返されるイテレータは、fail-fastです: イテレータの作成後にHashtableが構造的に変更された場合、イテレータ独自のremoveメソッド以外のすべての方法で、イテレータはConcurrentModificationExceptionをスローします。 このように、並行して変更が行われると、イテレータは、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。 Hashtableのkeysおよびelementsメソッドによって返される列挙は、高速ではありません。ハッシュ表が列挙の作成後にいつでも構造的に変更される場合、列挙の結果は定義されません。

通常、非同期の並行変更がある場合、確かな保証を行うことは不可能なので、イテレータのフェイルファストの動作を保証することはできません。 フェイルファスト・イテレータは、ベスト・エフォート・ベースでConcurrentModificationExceptionをスローします。 したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。イテレータのフェイルファストの動作はバグを検出するためにのみ使用すべきです。

このクラスは、Java 2プラットフォームv1.2の時点でMapインタフェースを実装するように改良された結果、Java Collections Frameworkのメンバーとなりました。 新しいコレクションの実装とは異なり、Hashtableは同期をとります。 スレッドセーフな実装が必要ない場合は、Hashtableの代わりにHashMapを使用することをお薦めします。 スレッドセーフで高度な並列実装が必要な場合は、Hashtableの代わりにConcurrentHashMapを使用することをお薦めします。

導入されたバージョン:
1.0
関連項目: