HashMapとHashtableの違い
2734 ワード
まず2つのクラスの定義を見てみましょう.
HashtableはDictiionaryから継承され、HashMapはAbstractMapから継承されていることがわかります.
HashTableのputメソッドは次のとおりです.
注意1メソッドは同期化されています
注意2メソッドはvalue=nullを許可しません注意3メソッドはkeyのhashCodeメソッドを呼び出し、key=nullの場合、空のポインタ異常が放出されます
HashMapのputメソッドは次のとおりです.
注意1メソッドは非同期です
注意2メソッドはkey=nullを許可します3メソッドはvalueを呼び出していないのでnullを許可します
補足:Hashtableにはcontainsメソッドがあり、誤解を招きやすいので、HashMapではすでに削除されています.もちろん、2つのクラスはcontainsKeyとcontainsValueメソッドを使用しています.
異なる点
HashMap
Hashtable
親
AbstractMap
Dictiionary
同期するかどうか
いいえ
はい
スレッドが安全かどうか
いいえ
はい
k,v null可否
はい
いいえ
public class Hashtable
extends Dictionary
implements Map, Cloneable, java.io.Serializable
public class HashMap
extends AbstractMap
implements Map, Cloneable, Serializable
HashtableはDictiionaryから継承され、HashMapはAbstractMapから継承されていることがわかります.
HashTableのputメソッドは次のとおりです.
public synchronized V put(K key, V value) { //###### 1
// Make sure the value is not null
if (value == null) { //###### 2
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable.
Entry tab[] = table;
int hash = key.hashCode(); //###### 3
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry e = tab[index]; e != null; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
V old = e.value;
e.value = value;
return old;
}
}
modCount++;
if (count >= threshold) {
// Rehash the table if the threshold is exceeded
rehash();
tab = table;
index = (hash & 0x7FFFFFFF) % tab.length;
}
// Creates the new entry.
Entry e = tab[index];
tab[index] = new Entry(hash, key, value, e);
count++;
return null;
}
注意1メソッドは同期化されています
注意2メソッドはvalue=nullを許可しません注意3メソッドはkeyのhashCodeメソッドを呼び出し、key=nullの場合、空のポインタ異常が放出されます
HashMapのputメソッドは次のとおりです.
public V put(K key, V value) { //###### 1
if (key == null) //###### 2
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i); //######
return null;
}
注意1メソッドは非同期です
注意2メソッドはkey=nullを許可します3メソッドはvalueを呼び出していないのでnullを許可します
補足:Hashtableにはcontainsメソッドがあり、誤解を招きやすいので、HashMapではすでに削除されています.もちろん、2つのクラスはcontainsKeyとcontainsValueメソッドを使用しています.
異なる点
HashMap
Hashtable
親
AbstractMap
Dictiionary
同期するかどうか
いいえ
はい
スレッドが安全かどうか
いいえ
はい
k,v null可否
はい
いいえ