关于HashMap,HashTable的区别

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

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

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

  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 进行同步的同步块将这一对语句包装起来。

HashtableVector因为它们是线程安全的所以不会出现这样的问题。
   
  2.HashTable
不允许null(keyvalue都不可以),HashMap允许null(keyvalue都可以)  
   
  3.HashTable
有一个contains(Object   value),功能和containsValue(Object   value)功能一样。  
   
  4.HashTable
使用EnumerationHashMap使用Iterator  
   
 
以上只是表面的不同,它们的实现也有很大的不同。  
   
  5.HashTable
hash数组默认大小是11,增加的方式是   old*2+1HashMaphash数组的默认大小是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    
  }  

你可能感兴趣的:(多线程,框架)