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

San*_*edi 0 java hashtable hashmap hashset

我已经知道当我们有Key-Value对时我们使用HashMap,而当我们不需要重复数据时我们使用HashSet.但是我总是对Hashtable发挥作用感到困惑.它是一个完全不同的数据结构吗?或者HashMap和HashSet都使用哈希函数在Hashtable中存储数据?彻底的解释将非常有用.

Phi*_*ipp 6

更具体一点,HashSet内部使用 a HashMap,看一下实现HashSet.java

private transient HashMap<E,Object> map;
Run Code Online (Sandbox Code Playgroud)

正如之前的答案和 HashMap 的 JavaDoc 中所述,HashMap 实现基于哈希表数据结构:

基于哈希表的 Map 接口实现。此实现提供了所有可选的映射操作,并允许空值和空键。(HashMap 类大致相当于 Hashtable,只不过它是不同步的并且允许 null。)该类不保证映射的顺序;特别是,它不保证顺序随着时间的推移保持不变。

java.util 包中还提供了一个Hashtable(识别小写的t )。JavaDoc 中也说明了主要区别:

与新的集合实现不同,Hashtable 是同步的。如果不需要线程安全的实现,建议使用HashMap代替Hashtable。如果需要线程安全的高并发实现,那么建议使用ConcurrentHashMap代替Hashtable。

也就是说,JavaDoc 声明Hashtable永远不应该使用它。如果您需要线程安全的实现,请使用ConcurrentHashMap,否则使用HashMap. 如果您需要并发集,您应该查看为什么没有针对 ConcurrentHashMap 的 ConcurrentHashSet。如果您正在寻找一个好的 set 实现,只需使用HashSet(内部只不过是 a HashMap)。


Lou*_*man 5

两者HashMapHashSet用哈希表(注意小写!),这是写某一种数据结构的一般方法的名称.你可以编写自己的哈希表; 我写了自己的哈希表; 哈希表只是一种通用的数据结构设计,就像你可以使用未实现的链表一样LinkedList.(注意HashSet实际上是使用HashMap,但这对您的问题并不是特别重要.)

HashtableHashMap不再推荐使用的类型的Java API ,因为HashMap它的工作基本上更好.你永远不应该使用它.