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

Java HashSet和HashMap都使用Hashtable吗?或者哈希表是完全不同的数据结构?,java,hashmap,hashtable,hashset,Java,Hashmap,Hashtable,Hashset,我已经知道,当我们有键值对时,我们使用HashMap,当我们不需要重复数据时,我们使用HashSet。但我总是对哈希表在哪里起作用感到困惑。它是一个完全不同的数据结构吗或者HashMap和HashSet都使用哈希函数在哈希表中存储数据?透彻的解释将非常有用。HashMap和HashSet都使用哈希表(注意小写!),它是编写某种数据结构的通用方法的名称。您可以编写自己的哈希表;我已经编写了自己的哈希表;哈希表只是一种通用的数据结构设计,就像您可以拥有不使用LinkedList实现的链表一样。(注意

我已经知道,当我们有键值对时,我们使用HashMap,当我们不需要重复数据时,我们使用HashSet。但我总是对哈希表在哪里起作用感到困惑。它是一个完全不同的数据结构吗或者HashMap和HashSet都使用哈希函数在哈希表中存储数据?透彻的解释将非常有用。

HashMap和
HashSet
都使用哈希表(注意小写!),它是编写某种数据结构的通用方法的名称。您可以编写自己的哈希表;我已经编写了自己的哈希表;哈希表只是一种通用的数据结构设计,就像您可以拥有不使用
LinkedList
实现的链表一样。(注意
HashSet
实际上是使用
HashMap
实现的,但这对于您的问题并不特别重要。)


Hashtable
是一种Java API,用于类似于不再推荐使用的
HashMap
类型,因为
HashMap
基本上做得更好。您不应该使用它。

无论是
HashMap
还是
HashSet
都使用哈希表(注意小写!),它是编写某种数据结构的通用方法的名称。您可以编写自己的哈希表;我已经编写了自己的哈希表;哈希表只是一种通用的数据结构设计,就像您可以拥有不使用
LinkedList
实现的链表一样。(注意
HashSet
实际上是使用
HashMap
实现的,但这对于您的问题并不特别重要。)


Hashtable
是一种Java API,用于类似于不再推荐使用的
HashMap
类型,因为
HashMap
基本上做得更好。您不应该使用它。

更具体地说,
HashSet
在内部使用了一个
HashMap
,请查看
HashSet.java

private transient HashMap<E,Object> map;
私有瞬态HashMap;
正如前面的回答和HashMap的JavaDoc中所述,HashMap实现基于哈希表数据结构:

基于哈希表的映射接口实现。这个实现提供了所有可选的映射操作,并允许空值和空键。(HashMap类大致相当于Hashtable,只是它不同步并且允许空值。)该类不保证映射的顺序;特别是,它不能保证订单在一段时间内保持不变

java.util包中还有一个
哈希表(识别小写t)。JavaDoc中也说明了主要区别:

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


也就是说,JavaDoc声明永远不应该使用
Hashtable
。如果需要线程安全的实现,请使用
ConcurrentHashMap
,否则请使用
HashMap
。如果你需要一个并发集,你应该看看。如果您正在寻找一个好的集合实现,只需使用
HashSet
(它在内部只是一个
HashMap
)。

更具体地说,
HashSet
在内部使用
HashMap
,请查看
HashSet.java

private transient HashMap<E,Object> map;
私有瞬态HashMap;
正如前面的回答和HashMap的JavaDoc中所述,HashMap实现基于哈希表数据结构:

基于哈希表的映射接口实现。这个实现提供了所有可选的映射操作,并允许空值和空键。(HashMap类大致相当于Hashtable,只是它不同步并且允许空值。)该类不保证映射的顺序;特别是,它不能保证订单在一段时间内保持不变

java.util包中还有一个
哈希表(识别小写t)。JavaDoc中也说明了主要区别:

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


也就是说,JavaDoc声明永远不应该使用
Hashtable
。如果需要线程安全的实现,请使用
ConcurrentHashMap
,否则请使用
HashMap
。如果你需要一个并发集,你应该看看。如果您正在寻找一个好的集合实现,只需使用
HashSet
(它在内部只不过是一个
HashMap
)。

请为您正在使用的语言添加一个标记。请为您正在使用的语言添加一个标记。您的意思是Hashtable可以更好地完成HashMap的工作吗?@SandipSubedi,不,相反。因此,最好使用HashMap而不是HashTtable?我是否应该假设HashMap是在Hashtable之后引入的?@SandipSubedi是的,是的。你的意思是Hashtable做HashMap的工作更好?@SandipSubedi,不是,反过来说。所以,最好使用HashMap而不是HashTtable?我是否应该假设HashMap是在Hashtable之后引入的?@SandipSubedi是和是。