JAVA中HashMap和Hashtable区别

Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现,它们都是集合中将数据无序存放的。数组

1.Hashtable的方法是同步的,HashMap未经同步,因此在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList同样。
查看Hashtable的源代码就能够发现,除构造函数外,Hashtable的全部 public 方法声明中都有 synchronized 关键字,而HashMap的源代码中则连 synchronized 的影子都没有,固然,注释除外。多线程

2.Hashtable不容许 null 值(key 和 value 都不能够),HashMap容许 null 值(key和value均可以)。函数

3.二者的遍历方式大同小异,Hashtable仅仅比HashMap多一个elements方法。线程

Hashtable table = new Hashtable();  
table.put("key", "value");
Enumeration em = table.elements();  
while (em.hasMoreElements()) {  
   String obj = (String) em.nextElement();  
   System.out.println(obj);   
}

4.HashTable使用Enumeration,HashMap使用Iterator。code

从内部机制实现上的区别以下:
1.哈希值的使用不一样,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();  
  
  h += ~(h << 9);  
  h ^= (h >>> 14);  
  h += (h << 4);  
  h ^= (h >>> 10);  
  return h;  
}  
  
static int indexFor(int h, int length) {  
  return h & (length-1);

2.Hashtable中hash数组默认大小是11,增长的方式是 old*2+1。HashMap中hash数组的默认大小是16,并且必定是2的指数。element

相关文章
相关标签/搜索