IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Hashtable和HashMap的区别

    wangshuxuncom发表于 2015-04-14 08:30:39
    love 0

    1、两者继承的直接父类不同:Hashtable继承自Dictiionary,HashMap继承自AbstractMap,这一区别可以通过两者的源码明显地看到:

    public class HashMap
        extends AbstractMap
        implements Map, Cloneable, Serializable
    
    public class Hashtable
        extends Dictionary
        implements Map, Cloneable, java.io.Serializable

    2、

    Hashtable的put方法如下:

    public synchronized V put(K key, V value) {
      // Make sure the value is not null 
      if (value == null) { 
        throw new NullPointerException(); 
      } 
      // Makes sure the key is not already in the hashtable. 
      Entry tab[] = table; 
      int hash = key.hashCode(); 
      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; 
    }
    HashMap的put方法如下:
    public V put(K key, V value) { 
      if (key == null)
        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; 
    } 

    通过比对Hashtable与HashMap的put方法,我们很容易得出这样的结论:

    a、Hashtable的put方法是同步的,线程安全的;HashMap的put方法不是同步的,非线程安全的:由此可见在多线程情况下应该使用Hashtable中的put方法,反之应该使用HashMap中的put方法;由此也可以得出这样的结论Hashtable的put方法效率低于HashMap的put方法;

    b、在向Hashtable中put数据时,key与value均不能为null,而在向HashMap中put数据时,key与value都可以为空;



沪ICP备19023445号-2号
友情链接