HashMap和Hashtable的区别

HashMap和Hashtable都是实现了map接口,但决定用哪一个先要弄清楚他们之间的区别:主要的区别是:线程安全,同步(synchronization),速度;

  1. hashMap几乎可以等价于hashtable,除了hashMap是非synchronized的,并可以接收null(hashmap可以接受null的键值对,而hashtable不行)
  2. hashmap是非synchronized,而hashtable是synchronized的,这以为着hashtable是线程安全的,多个线程可以共享一个hashtable.Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
  3. hashmap的迭代器(Ierator)是fail-fast迭代器,而hashtable的enumerator迭代器不是fail-fast的.所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
    4.由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
    5.HashMap不能保证随着时间的推移Map中的元素次序是不变的。

其他:

  • sychronized意味着在一次仅有一个线程能够更改hashtable.就是说任何线程更新hashtable时要首先获得同步锁,其他线程要等到同步锁释放之后才能再次获得同步锁更新hashtable.
  • Fail-safe和Iterator迭代器相关.如果某个集合对象创建了Iterator或这个ListIterator,然后其他的线程试图结构上更改集合对象,将会抛出ConcurrentModificationException异常.但是其他的线程可以通过set()方法更改集合对象是允许的,因为这并没有从结构上更改集合.但是假如已经从结构上进行了更改,再调用set()
    方法,将会抛出IllegalArgumentException异常.
    结构上更改指的是删除或者插入一个元素,这样会影响map的结构.

HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);

结论
Hashtable和HashMap有几个主要的不同:线程安全以及速度。仅在你需要完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap吧。

原文链接: Javarevisited 翻译: ImportNew.com - 唐小娟
译文链接: http://www.importnew.com/7010.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值