Hashtable, HashMap, HashSet , Java 集合框架中的 Hash table 概念

2022-09-01 04:58:08

我正在学习Java集合框架,并得到了适度的理解。现在,当我走得更远时,我有一些疑问:,,。HashMapHashSetHashtable

Javadoc 说:HashMap

基于哈希表的 Map 接口实现。此实现提供所有可选的映射操作,并允许空值和空键。

Javadoc 说:HashSet

此类实现 Set 接口,该接口由哈希表(实际上是哈希映射实例)提供支持。它不保证集合的迭代顺序;特别是,它不保证订单将随着时间的推移而保持不变。

Javadoc 说:Hashtable

此类实现一个哈希表,该表将键映射到值。任何非空对象都可以用作键或值。

令人困惑的是,他们都实现了 .他们是否实现了哈希表的概念hash table

似乎所有这些都是相互关联的,但我无法完全理解它。

任何人都可以帮助我用简单的语言理解这个概念。


答案 1

Java 和接口指定了两种截然不同的集合类型。A 就是它听起来的样子:不同(不相等)对象的集合,没有其他结构。从概念上讲,A也只是它听起来的样子:从一组对象(不同的键)到对象集合(值)的映射。 并且两者都实现了,实现,并且它们都使用哈希代码来表示集合中包含的键/对象以提高性能。SetMapSetMapHashtableHashMapMapHashSetSet

HashtableHashMap

Hashtable是一个遗留类,几乎总是应该避免使用。它们基本上做同样的事情,只是中的大多数方法都是同步的,这使得单个方法调用是线程安全的。1 如果您使用的是多个线程,则必须提供自己的同步或其他线程安全机制。HashMapHashtableHashMap

问题在于,同步每个方法调用(这是一个不容忽视的操作)通常是错误的事情。要么根本不需要同步,要么从应用程序逻辑的角度来看,需要跨多个方法调用的事务进行同步。由于不可能在不破坏现有代码的情况下简单地删除方法级同步,因此集合框架的作者需要提出一个新类;因此。这也是一个更好的名字,因为很明显它是一种.HashtableHashtableHashMapMap

哦,如果您确实需要方法级同步,则仍然不应使用 .相反,您可以调用 Collections.synchronizedMap() 将任何映射转换为同步映射。或者,您可以使用 ,根据文档:“遵循与”相同的功能规范,但具有更好的性能和附加功能(例如)。HashtableConcurrentHashMapHashtableputIfAbsent()

1还有其他差异(在我看来不太重要),例如HashMap支持值和键。

HashSet

在功能方面,与.它碰巧在内部使用 a 来实现该功能。出于某种原因,Collections 框架开发人员认为,将此内部实现细节作为类的公共规范的一部分是一个好主意。HashSetHashMapHashMapSet


答案 2

Hashtable是一个古老的类,是在Java有泛型之前创建的。它只是为了向后兼容而仍然存在。请改用 HashMap。

在不需要将键映射到值时使用 HashSet。它建立在与哈希表相同的算法之上,但它用于根本不同的目的。


推荐