关于HashMap,HashTable的区别

1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

然而,线程安全性是凭代价换来的―― Hashtable 的所有方法都是同步的。Hashtable 的后继者 HashMap 是作为JDK1.2中的集合框架的一部分出现的,它通过提供一个不同步的基类和一个同步的包装器 Collections.synchronizedMap ,解决了线程安全性问题。 通过将基本的功能从线程安全性中分离开来, Collections.synchronizedMap 允许需要同步的用户可以拥有同步,而不需要同步的用户则不必为同步付出代价。

但是synchronizedMapsynchronizedList 是有条件的线程同步(所有 单个的操作都是线程安全的)。在多线程并发的时候还是可能出现错误。

  Map m = Collections.synchronizedMap(new HashMap());
    List l = Collections.synchronizedList(new ArrayList());
    // put-if-absent idiom -- contains a race condition
    // may require external synchronization
    if (!map.containsKey(key))
      map.put(key, value);
    // ad-hoc iteration -- contains race conditions
    // may require external synchronization
    for (int i=0; i<list.size(); i++) {
      doSomething(list.get(i));
    }
    // normal iteration -- can throw ConcurrentModificationException
    // may require external synchronization
    for (Iterator i=list.iterator(); i.hasNext(); ) {
      doSomething(i.next());
    }
 

如果一个条目不在 Map 中,那么添加这个条目。不幸的是, 在 containsKey() 方法返回到 put() 方法被调用这段时间内,可能会有另一个线程也插入一个带有相同键的值。如果您想确保只有一次插入,您需要用一个对 Map m 进行同步的同步块将这一对语句包装起来。

Hashtable和Vector因为它们是线程安全的所以不会出现这样的问题。
   
  2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。  
   
  3.HashTable有一个contains(Object   value),功能和containsValue(Object   value)功能一样。  
   
  4.HashTable使用Enumeration,HashMap使用Iterator。  
   
  以上只是表面的不同,它们的实现也有很大的不同。  
   
  5.HashTable中hash数组默认大小是11,增加的方式是   old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。  
   
  6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:  
  int   hash   =   key.hashCode();  
  int   index   =   (hash   &   0x7FFFFFFF)   %   tab.length;  
  而HashMap重新计算hash值,而且用与代替求模:  
  int   hash   =   hash(k);  
  int   i   =   indexFor(hash,   table.length);  
   
  static   int   hash(Object   x)   {  
    int   h   =   x.hashCode    
  }  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值