1. Hashtable は Dictionary のサブクラスです。
次のようにコードをコピーします。
パブリック クラス Hashtable<K,V>
Dictionary<K,V> を拡張します
Map<K,V>、Cloneable、java.io.Serializable を実装します
ハッシュマップ:
次のようにコードをコピーします。
パブリック クラス HashMap<K,V>
AbstractMap<K,V> を拡張します
Map<K,V> を実装、クローン可能、シリアル化可能
HashMap と Hashtable は両方とも Map インターフェイスの実装クラスです。
2. Hashtable のメソッドは同期 () ですが、HashMap のメソッドはデフォルトでは同期しません。つまり、マルチスレッド アプリケーションでは、Hashtable は特別な操作なしで安全に使用できますが、HashMap の場合は追加の同期メカニズムが必要です。ただし、HashMap の同期の問題は、コレクションの静的メソッドを通じて解決できます。
次のようにコードをコピーします。
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
このメソッドは同期された Map を返します。これは、返された Map がスレッドセーフであることを意味します。返されたマップを反復処理する場合は、返されたマップを手動で同期する必要があることに注意してください。そうしないと、未定義の動作が発生します。
次のようにコードをコピーします。
Map m = Collections.synchronizedMap(new HashMap());
...
Set s = m.keySet(); // 同期ブロック内にある必要はない
...
synchronized(m) { // s ではなく m で同期します!
Iterator i = s.iterator() // 同期ブロック内にある必要があります。
while (i.hasNext())
foo(i.next());
}
3. HashMap では、null をキーとして使用できますが、そのようなキーは 1 つだけあり、対応する値が null であるキーが 1 つ以上存在する可能性があります。 get() メソッドが null 値を返す場合、HashMap にキーが存在しないことを意味することも、キーに対応する値が null であることも意味することもあります。したがって、HashMap では、get() メソッドを使用して特定のキーが HashMap に存在するかどうかを判断することはできませんが、containsKey() メソッドを使用して判断する必要があります。 Hashtable のキー値を null にすることはできません。それ以外の場合: java.lang.NullPointerException。
4.HashTable は Enumeration を使用し、HashMap は Iterator を使用します。
上記は表面的な違いにすぎず、実装も大きく異なります。
5. HashTable のハッシュ配列のデフォルトのサイズは 11 で、増加方法は old*2+1 です。 HashMap のハッシュ配列のデフォルトのサイズは 16 で、指数は 2 である必要があります。
6. ハッシュ値の使用は異なります。HashTable はオブジェクトの hashCode を直接使用します。コードは次のとおりです。
次のようにコードをコピーします。
int ハッシュ = key.hashCode();
int インデックス = (ハッシュ & 0x7FFFFFFFF) % tab.length;
HashMap はハッシュ値を再計算し、HashMap の put メソッドなどの係数の代わりに AND を使用します。
次のようにコードをコピーします。
public V put(K キー, V 値) {
if (キー == null)
putForNullKey(値)を返します;
int ハッシュ = ハッシュ(key.hashCode());
int i =indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
オブジェクト k;
if (e.hash == ハッシュ && ((k = e.key) == キー || key.equals(k)) {
VoldValue = e.value;
e.value = 値;
e.recordAccess(this);
oldValue を返します。
}
}
modCount++;
addEntry(ハッシュ、キー、値、i);
null を返します。
}
次のようにコードをコピーします。
静的 int ハッシュ(int h) {
// この関数は、次の点のみが異なる hashCode を保証します。
// 各ビット位置の定数倍数には制限があります
// 衝突の数 (デフォルトの負荷率では約 8)。
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
次のようにコードをコピーします。
static int IndexFor(int h, int length) {
h & (長さ-1) を返します。
}