HashMap和Hashtable的区别

转载 2015年07月11日 10:37:25

[转]HashMap Hashtable区别

http://blog.csdn.net/java2000_net/archive/2008/06/05/2512510.aspx

 

我们先看2个类的定义

[java] view plaincopy
  1. public class Hashtable  
  2.     extends Dictionary  
  3.     implements Map, Cloneable, java.io.Serializable  
[java] view plaincopy
  1. public class HashMap  
  2.     extends AbstractMap  
  3.     implements Map, Cloneable, Serializable  

可见Hashtable 继承自 Dictiionary 而 HashMap继承自AbstractMap

Hashtable的put方法如下

[java] view plaincopy
  1. public synchronized V put(K key, V value) {  //###### 注意这里1  
  2.   // Make sure the value is not null  
  3.   if (value == null) { //###### 注意这里 2  
  4.     throw new NullPointerException();  
  5.   }  
  6.   // Makes sure the key is not already in the hashtable.  
  7.   Entry tab[] = table;  
  8.   int hash = key.hashCode(); //###### 注意这里 3  
  9.   int index = (hash & 0x7FFFFFFF) % tab.length;  
  10.   for (Entry e = tab[index]; e != null; e = e.next) {  
  11.     if ((e.hash == hash) && e.key.equals(key)) {  
  12.       V old = e.value;  
  13.       e.value = value;  
  14.       return old;  
  15.     }  
  16.   }  
  17.   modCount++;  
  18.   if (count >= threshold) {  
  19.     // Rehash the table if the threshold is exceeded  
  20.     rehash();  
  21.     tab = table;  
  22.     index = (hash & 0x7FFFFFFF) % tab.length;  
  23.   }  
  24.   // Creates the new entry.  
  25.   Entry e = tab[index];  
  26.   tab[index] = new Entry(hash, key, value, e);  
  27.   count++;  
  28.   return null;  
  29. }  
注意1 方法是同步的
注意2 方法不允许value==null
注意3 方法调用了key的hashCode方法,如果key==null,会抛出空指针异常 HashMap的put方法如下
[java] view plaincopy
  1. public V put(K key, V value) { //###### 注意这里 1  
  2.   if (key == null)  //###### 注意这里 2  
  3.     return putForNullKey(value);  
  4.   int hash = hash(key.hashCode());  
  5.   int i = indexFor(hash, table.length);  
  6.   for (Entry e = table[i]; e != null; e = e.next) {  
  7.     Object k;  
  8.     if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {  
  9.       V oldValue = e.value;  
  10.       e.value = value;  
  11.       e.recordAccess(this);  
  12.       return oldValue;  
  13.     }  
  14.   }  
  15.   modCount++;  
  16.   addEntry(hash, key, value, i);  //###### 注意这里   
  17.   return null;  
  18. }  

注意1 方法是非同步的
注意2 方法允许key==null
注意3 方法并没有对value进行任何调用,所以允许为null

补充: 
Hashtable 有一个 contains方法,容易引起误会,所以在HashMap里面已经去掉了
当然,2个类都用containsKey和containsValue方法。最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,

在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(Collections.synchronizedMap)。

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

结论: hashMap 在大多数情况下是优先选择的。

 

 


 

 


 


HashTable和HashMap的区别详解

一、HashMap简介       HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。       Has...
  • fujiakai
  • fujiakai
  • 2016年06月04日 19:35
  • 31039

HashMap工作原理以及与HashTable的区别--面试题

每当往hashmap里面存放key-value对的时候,都会为它们实例化一个Entry对象,这个Entry对象就会存储在前面提到的Entry数组table中。现在你一定很想知道,上面创建的Entry对...
  • feicongcong
  • feicongcong
  • 2017年01月04日 13:15
  • 139

HashMap的实现原理及与 HashTable, Treemap的区别

Java中的接口Map由于是(K, V)键值对形式的存储结构,在编程中经常被用到,常用的实现类有:HashMap, HashTable, TreeMap.HashMap的实现原理:HashMap是数组...
  • y999666
  • y999666
  • 2016年05月25日 22:33
  • 1028

hashmap与Hashtable实现原理浅析

原文地址:http://www.cnblogs.com/lzrabbit/p/3721067.html#h1 HashMap和Hashtable的区别两者最主要的区别在于Hashtable是线程安全,...
  • Double2hao
  • Double2hao
  • 2016年11月30日 18:21
  • 3517

Java中Map接口HashMap与HashTable的区别及HashMap深入理解

HashMap和HashTable都完成了Map接口,实际上HashMap是HashTable轻量级实现(非线程安全的实现),对比于ArrayList和Vector的区别: HashMap和Array...
  • u012050154
  • u012050154
  • 2016年03月16日 15:29
  • 4487

HashMap和HashTable异同点及使用场景

HashMap和HashTable异同点及使用场景 HashMap和HashTable异同点及使用场景 线程安全不同是否允许null值不同继承实现方式不同初始容量和扩容策略不同计算hash...
  • romantic_PK
  • romantic_PK
  • 2017年01月11日 00:32
  • 642

java集合框架12——HashMap和HashTable的区别

前面已经学习了Map的部分内容,主要是HashMap和HashTable,这一节我们来看看它们两有啥异同点。 1. HashMap和HashTable的相同点         HashMap和Hash...
  • eson_15
  • eson_15
  • 2016年04月26日 15:50
  • 3208

C#hashtable使用说明 以及 Hashtable和HashMap的区别【总结性】

一,哈希表(Hashtable)简述    在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value...
  • mao_mao37
  • mao_mao37
  • 2016年07月13日 11:06
  • 3096

HashMap和Hashtable的详细区别

HashMap和Hashtable的区别 两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全。Hashtable的实现方法里面都添加了synchronized关键字来确保线...
  • qq_35181209
  • qq_35181209
  • 2017年07月05日 22:14
  • 159

HashTable底层代码及与HashTable的差别

Hashtable简介     Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 ...
  • weixin_40667145
  • weixin_40667145
  • 2017年11月22日 21:31
  • 70
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HashMap和Hashtable的区别
举报原因:
原因补充:

(最多只允许输入30个字)