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】:

HashMapHashSet 都使用哈希表(注意小写!),这是编写某种数据结构的通用方式的名称。您可以编写自己的哈希表;我已经编写了自己的哈希表;哈希表只是一种通用的数据结构设计,就像您可以拥有未使用 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 是完全不同的数据结构?的主要内容,如果未能解决你的问题,请参考以下文章

java面试之Hashmap

HashSet源码解析

HashSet 和 HashMap 都使用 Hashtable 吗?或者 Hashtable 是完全不同的数据结构?

HashSet 和 HashMap 的区别?

HashMap和HashSet的区别?

Set(一):HashSet、LinkedHasSet源码浅析