ハッシュテーブルとハッシュマップの違い
まず、継承された親クラスが異なります。
Hashtable は Dictionary クラスを継承し、HashMap は AbstractMap クラスを継承します。ただし、どちらも Map インターフェイスを実装しています。
次のようにコードをコピーします。
パブリック クラス Hashtable<K,V>
Dictionary<K,V> を拡張します
Map<K,V> を実装、クローン可能、シリアル化可能
パブリック クラス HashMap<K,V>
AbstractMap<K,V> を拡張します
Map<K,V> を実装、クローン可能、シリアル化可能
次に、スレッドの安全性が異なります。
Hashtable のメソッドは同期されますが、HashMap のメソッドはデフォルトで非同期です。マルチスレッドの同時実行環境では、Hashtable のメソッドを自分で同期せずに直接使用できますが、HashMap を使用する場合は、自分で同期処理を追加する必要があります。
第三に、contains メソッドを提供するかどうかです。
contains メソッドは誤解を招きやすいため、HashMap は Hashtable の contains メソッドを削除し、containsValue と containsKey に変更しました。
Hashtable は、contains、containsValue、containsKey の 3 つのメソッドを保持します。このうち、contains と containsValue は同じ機能を持ちます。
4 番目に、キーと値が null 値を許可するかどうか。
キーと値は両方ともオブジェクトであり、重複キーを含めることはできませんが、重複値を含めることはできます。
Hashtable では、キーと値の両方に null 値は許可されません。
HashMap では、null をキーとして使用できますが、そのようなキーは 1 つだけあり、対応する値が null であるキーが 1 つ以上存在する可能性があります。 get() メソッドが null 値を返す場合、HashMap にキーが存在しないか、キーに対応する値が null である可能性があります。したがって、HashMap では、get() メソッドを使用して特定のキーが HashMap に存在するかどうかを判断することはできませんが、containsKey() メソッドを使用して判断する必要があります。
第 5 に、2 つのトラバーサル メソッドの内部実装が異なります。
Hashtable と HashMap はどちらも Iterator を使用します。歴史的な理由により、Hashtable も列挙を使用します。
第六に、ハッシュ値が異なります。
HashTable はオブジェクトの hashCode を直接使用します。そしてHashMapはハッシュ値を再計算します。
7 番目に、内部実装では異なる配列の初期化および拡張メソッドが使用されます。
Hashtable と HashMap の 2 つの内部実装における配列の初期サイズと拡張メソッド。 HashTable のハッシュ配列のデフォルトのサイズは 11 で、増加方法は old*2+1 です。
HashMap のハッシュ配列のデフォルトのサイズは 16 で、指数は 2 である必要があります。