浅析Java中Map与HashMap,Hashtable,HashSet的区别

来源:互联网 发布:云服务器搭建sql serv 编辑:程序博客网 时间:2024/05/01 09:11

浅析Java中Map与HashMap,Hashtable,HashSet的区别

作者: 字体:[增加 减小] 类型:转载 时间:2013-09-03 我要评论

HashMap和Hashtable两个类都实现了Map接口,二者保存K-V对(key-value对);HashSet则实现了Set接口,性质类似于集合
<iframe id="iframeu2261530_0" src="http://pos.baidu.com/vcmm?sz=680x200&amp;rdid=2261530&amp;dc=2&amp;di=u2261530&amp;dri=0&amp;dis=0&amp;dai=2&amp;ps=418x90&amp;coa=at%3D3%26rsi0%3D680%26rsi1%3D200%26pat%3D6%26tn%3DbaiduCustNativeAD%26rss1%3D%2523FFFFFF%26conBW%3D1%26adp%3D1%26ptt%3D0%26titFF%3D%2525E5%2525BE%2525AE%2525E8%2525BD%2525AF%2525E9%25259B%252585%2525E9%2525BB%252591%26titFS%3D14%26rss2%3D%2523000000%26titSU%3D0%26ptbg%3D90%26piw%3D0%26pih%3D0%26ptp%3D0&amp;dcb=BAIDU_SSP_define&amp;dtm=BAIDU_DUP_SETJSONADSLOT&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1459137323120&amp;ti=%E6%B5%85%E6%9E%90Java%E4%B8%ADMap%E4%B8%8EHashMap%2CHashtable%2CHashSet%E7%9A%84%E5%8C%BA%E5%88%AB_java_%E8%84%9A%E6%9C%AC%E4%B9%8B%E5%AE%B6&amp;ari=1&amp;dbv=2&amp;drs=1&amp;pcs=1171x594&amp;pss=1171x424&amp;cfv=0&amp;cpl=4&amp;chi=1&amp;cce=true&amp;cec=GBK&amp;tlm=1458267047&amp;ltu=http%3A%2F%2Fwww.jb51.net%2Farticle%2F41077.htm&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DR6aAEi8SUx6rdWkIFNXre7zmEpRPl2p8aJwWRxVCHg6jLrbJjYKa9YtXRQ-8i0DA%26wd%3D%26eqid%3Dc06333f3000066820000000556f8a7d8&amp;ecd=1&amp;psr=1366x768&amp;par=1366x728&amp;pis=-1x-1&amp;ccd=24&amp;cja=false&amp;cmi=6&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1459137323&amp;qn=684dc45a0c531496&amp;tt=1459137323093.78.332.336" width="680" height="200" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="display: block; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>

HashTable和HashMap区别

第一,继承的父类不同。
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

复制代码代码如下:

public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, Serializable

public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable


第二,线程安全性不同。
Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情况下是非Synchronize的。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步,但使用HashMap时就必须要自己增加同步处理。

第三,是否提供contains方法
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。

Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。

第四,key和value是否允许null值。
其中key和value都是对象,并且不能包含重复key,但可以包含重复的value。
Hashtable中,key和value都不允许出现null值。
HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,可能是 HashMap中没有该键,也可能使该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。

第五,两个遍历方式的内部实现上不同。
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。

第六,hash值不同。
哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

第七,内部实现使用的数组初始化和扩容方式不同。
Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。

HashMap中hash数组的默认大小是16,而且一定是2的指数。

0 0
原创粉丝点击