HashMapとHashtableの違い

2734 ワード

まず2つのクラスの定義を見てみましょう.
 
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可否
はい
いいえ