JavaにおけるHashtableクラスとHashMapクラスの違いの詳細
2188 ワード
Hashtableクラス
HashtableはMapインタフェースを継承し、key-valueマッピングのハッシュテーブルを実現する.空でないオブジェクトはkeyまたはvalueとして使用できます.
追加データはput(key,value)、取り出しデータはget(key)を使用し、この2つの基本動作の時間オーバーヘッドは定数である.
Hashtableはinitial capacityとload factorの2つのパラメータで性能を調整します.通常、デフォルトのload factor 0.75は、時間と空間の等化をより良く実現する.load factorを大きくすると、スペースを節約できますが、対応する検索時間が大きくなり、getやputのような操作に影響します.Hashtableを使用する簡単な例は、1,2,3をHashtableに配置し、keyはそれぞれ「one」、「two」、「three」である.
2のような数を取り出すには、対応するkeyを使用します.
keyとしてのオブジェクトは、そのハッシュ関数を計算することによって対応するvalueの位置を決定するので、keyとしてのオブジェクトはhashCodeおよびequalsメソッドを実装する必要があります.hashCodeメソッドとequalsメソッドはルートクラスObjectから継承されます.カスタムクラスをkeyとして使用する場合は、ハッシュ関数の定義に従って、2つのオブジェクトが同じであるobj 1である場合に注意してください.equals(obj 2)=trueの場合、hashCodeは同じでなければなりませんが、2つのオブジェクトが異なる場合、hashCodeは必ずしも異なるとは限りません.2つの異なるオブジェクトのhashCodeが同じである場合、この現象を衝突と呼び、衝突はハッシュテーブルを操作する時間のオーバーヘッドを増大させ、できるだけ定義されたhashCode()メソッドで、ハッシュテーブルの操作を速めることができます.
同じオブジェクトに異なるhashCodeがある場合、ハッシュ・テーブルの操作で予想外の結果が得られます(期待されるgetメソッドはnullを返します).このような問題を回避するには、equalsメソッドとhashCodeメソッドを同時に複写し、そのうちの1つだけ書かないでください.Hashtableは同期しています.
HashMapクラス
HashMapはHashtableと同様であり、HashMapが非同期であり、null、すなわちnull valueおよびnull keyを許容する点が異なる.ただし、HashMapをCollectionと見なす場合(values()メソッドはCollectionを返します)、反復サブオペレーション時間のオーバーヘッドはHashMapの容量に比例します.したがって,反復動作の性能がかなり重要であれば,HashMapの初期化容量を高すぎる,あるいはload factorが低すぎるようにしてはならない.
まとめ Hashtableの方法は同期であり,HashMapは非同期であるため,マルチスレッドの場合にHashMapを手動で同期するという違いはVectorとArrayListのようなものである. Hashtableはnull値を許可しません(keyもvalueもできません)、HashMapはnull値を許可します(keyもvalueもできます). Hashtableは、HashMapよりも多くのelementsメソッドを巡回するために使用します. HashtableはEnumeration、HashMapはIteratorを使用します. ハッシュ値の使用は異なり、HashtableはオブジェクトのhashCodeを直接使用し、HashMapはhash値を再計算し、代わりにモデリングする. Hashtableではhash配列のデフォルトサイズは11であり、増加する方法はold*2+1である.HashMapにおけるhash配列のデフォルトサイズは16であり,必ず2の指数である.
HashtableはMapインタフェースを継承し、key-valueマッピングのハッシュテーブルを実現する.空でないオブジェクトはkeyまたはvalueとして使用できます.
追加データはput(key,value)、取り出しデータはget(key)を使用し、この2つの基本動作の時間オーバーヘッドは定数である.
Hashtableはinitial capacityとload factorの2つのパラメータで性能を調整します.通常、デフォルトのload factor 0.75は、時間と空間の等化をより良く実現する.load factorを大きくすると、スペースを節約できますが、対応する検索時間が大きくなり、getやputのような操作に影響します.Hashtableを使用する簡単な例は、1,2,3をHashtableに配置し、keyはそれぞれ「one」、「two」、「three」である.
Hashtable numbers = new Hashtable();
numbers.put("one", new Integer(1));
numbers.put("two", new Integer(2));
numbers.put("three", new Integer(3));
2のような数を取り出すには、対応するkeyを使用します.
Integer n = (Integer)numbers.get("two");
System.out.println("two = " + n);
keyとしてのオブジェクトは、そのハッシュ関数を計算することによって対応するvalueの位置を決定するので、keyとしてのオブジェクトはhashCodeおよびequalsメソッドを実装する必要があります.hashCodeメソッドとequalsメソッドはルートクラスObjectから継承されます.カスタムクラスをkeyとして使用する場合は、ハッシュ関数の定義に従って、2つのオブジェクトが同じであるobj 1である場合に注意してください.equals(obj 2)=trueの場合、hashCodeは同じでなければなりませんが、2つのオブジェクトが異なる場合、hashCodeは必ずしも異なるとは限りません.2つの異なるオブジェクトのhashCodeが同じである場合、この現象を衝突と呼び、衝突はハッシュテーブルを操作する時間のオーバーヘッドを増大させ、できるだけ定義されたhashCode()メソッドで、ハッシュテーブルの操作を速めることができます.
同じオブジェクトに異なるhashCodeがある場合、ハッシュ・テーブルの操作で予想外の結果が得られます(期待されるgetメソッドはnullを返します).このような問題を回避するには、equalsメソッドとhashCodeメソッドを同時に複写し、そのうちの1つだけ書かないでください.Hashtableは同期しています.
HashMapクラス
HashMapはHashtableと同様であり、HashMapが非同期であり、null、すなわちnull valueおよびnull keyを許容する点が異なる.ただし、HashMapをCollectionと見なす場合(values()メソッドはCollectionを返します)、反復サブオペレーション時間のオーバーヘッドはHashMapの容量に比例します.したがって,反復動作の性能がかなり重要であれば,HashMapの初期化容量を高すぎる,あるいはload factorが低すぎるようにしてはならない.
まとめ