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