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