第一次写博客,谈谈对HashMap和Hashtable的区别理解

今天看到JAVA基础中有关于HashMap和Hashtable的区别,字面上比较笼统,因此决定具体进行了解。


Hashtable已经是个过时的集合类,在Java 4中被重写了,实现了Map接口,所以自此以后也成了Java集合框架中的一部分。所以HashMap相对于Hashtable有它自己的优点,HashMap:基于哈希表的 Map 接口的实现,二者其实可以说是几乎等价的。

二者的主要区别在于:

HashMap允许将null作为一个entrykey或者value,而HashTable不可以,这是最大的区别;

②HashMap是非synchronized的,而HashTable是synchronized的,是线程安全的,即是说

多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。HashMap是非线程安全的,从这点上来讲,HashMap的效率要高于HashTable。

③另一个比较偏的区别在于,HashMap的迭代器(Iterator)是fail-fast迭代器,而HashTable的迭代器(enumerator)不是fail-fast迭代器,因此如果有其他线程改变了HashMap的结构,将会提示ConcurrentModificationException,不过如果是迭代器本身的remove()方法移除元素的话就不会抛出异常。

此外提一点,也可以令HashMap同步,只需要输入以下语句:

Map m=Collections.synchronizeMap(hashMap);

先分别观察两个类的定义:

public class Hashtable  
    extends Dictionary  
    implements Map, Cloneable, java.io.Serializable  
public class HashMap  
    extends AbstractMap  
    implements Map, Cloneable, Serializable  
可见Hashtable 继承自 Dictiionary ,而 HashMap继承自AbstractMap。其次再观察二者的put方法:

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;  
}  
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;  
}  
从代码中可以更加直观地看出二者的区别,这次再重述一遍:

①HashTable是同步的,HashMap是非同步的

②HashTable不允许value==null,又调用了key的hashCode方法,因此如果key==null,会抛出空指针异常

③HashMap允许key==null,因为没有对value进行调用,因此允许为null

第一次写博客,其中知识点部分参照前辈的研究,也有一些自己的尝试和理解。希望每日能坚持学习一个或多个知识点吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值