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

本文深入探讨了Java中Map接口的实现类HashMap和Hashtable,以及Set接口的实现类HashSet之间的区别,包括继承关系、线程安全、contains方法、键值允许null值、遍历方式、哈希算法、数组初始化和扩容方式等方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

HashMap和Hashtable两个类都实现了Map接口,二者保存K-V对(key-value对);HashSet则实现了Set接口,性质类似于集合
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;">

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的指数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值