HashSet 和 HashMap 都使用 Hashtable 吗?或者 Hashtable 是完全不同的数据结构?
Posted
技术标签:
【中文标题】HashSet 和 HashMap 都使用 Hashtable 吗?或者 Hashtable 是完全不同的数据结构?【英文标题】:Does HashSet and HashMap both use Hashtable ? Or Hashtable is totally different data structure? 【发布时间】:2016-07-07 11:40:11 【问题描述】:我已经知道当我们有键值对时我们使用 HashMap,当我们不需要重复数据时我们使用 HashSet。但我总是对 Hashtable 发挥作用的地方感到困惑。它是完全不同的数据结构吗? 或者HashMap和HashSet都使用hash函数在Hashtable中存储数据?详尽的解释将非常有帮助。
【问题讨论】:
请为您使用的语言添加标签。 【参考方案1】:HashMap
和HashSet
都使用哈希表(注意小写!),这是编写某种数据结构的通用方式的名称。您可以编写自己的哈希表;我已经编写了自己的哈希表;哈希表只是一种通用的数据结构设计,就像您可以拥有未使用 LinkedList
实现的链表一样。 (注意HashSet
实际上是使用HashMap
实现的,但这对于您的问题并不是特别重要。)
Hashtable
是用于类似 HashMap
的类型的 Java API,不再推荐使用它,因为基本上 HashMap
做得更好。你不应该使用它。
【讨论】:
你的意思是 Hashtable 做 HashMap 的工作更好? @SandipSubedi,不,相反。 那么,用HashMap代替HashTtable更好吗?我应该假设 HashMap 的引入晚于 Hashtable 吗? @SandipSubedi 是的,是的。【参考方案2】:更具体一点,HashSet
内部使用了HashMap
,看HashSet.java
的实现
private transient HashMap<E,Object> map;
如上一个答案和 HashMap 的 JavaDoc 中所述,HashMap 实现基于哈希表数据结构:
Map 接口的基于哈希表的实现。此实现提供所有可选的映射操作,并允许空值和空键。 (HashMap 类大致相当于 Hashtable,除了它是不同步的并且允许空值。)这个类不保证映射的顺序;特别是,它不保证订单会随着时间的推移保持不变。
java.util 包中还有一个Hashtable
(识别小写t)。 JavaDoc 中也说明了主要区别:
与新的集合实现不同,Hashtable 是同步的。如果不需要线程安全的实现,建议使用 HashMap 代替 Hashtable。如果需要线程安全的高并发实现,推荐使用 ConcurrentHashMap 代替 Hashtable。
也就是说,JavaDoc 声明永远不应该使用Hashtable
。如果您需要线程安全的实现,请使用ConcurrentHashMap
,否则使用HashMap
。如果你需要一个并发集,你应该看看Why there is no ConcurrentHashSet against ConcurrentHashMap。如果您正在寻找一个好的集合实现,只需使用HashSet
(在内部只不过是HashMap
)。
【讨论】:
以上是关于HashSet 和 HashMap 都使用 Hashtable 吗?或者 Hashtable 是完全不同的数据结构?的主要内容,如果未能解决你的问题,请参考以下文章