您的位置:首页 > 编程语言 > Java开发

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

2016-03-28 12:50 736 查看


浅析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&rdid=2261530&dc=2&di=u2261530&dri=0&dis=0&dai=2&ps=418x90&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&dcb=BAIDU_SSP_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1459137323120&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&ari=1&dbv=2&drs=1&pcs=1171x594&pss=1171x424&cfv=0&cpl=4&chi=1&cce=true&cec=GBK&tlm=1458267047&ltu=http%3A%2F%2Fwww.jb51.net%2Farticle%2F41077.htm&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DR6aAEi8SUx6rdWkIFNXre7zmEpRPl2p8aJwWRxVCHg6jLrbJjYKa9YtXRQ-8i0DA%26wd%3D%26eqid%3Dc06333f3000066820000000556f8a7d8&ecd=1&psr=1366x768&par=1366x728&pis=-1x-1&ccd=24&cja=false&cmi=6&col=zh-CN&cdo=-1&tcn=1459137323&qn=684dc45a0c531496&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的指数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: