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

时间:2016-03-21 04:08:32

标签: java hashmap hashtable hashset

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

2 个答案:

答案 0 :(得分:5)

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

Hashtable是一种类似于HashMap的类型的Java API,不再推荐使用,因为HashMap基本上更好地完成了它的工作。你永远不应该使用它。

答案 1 :(得分: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)。