Java Collection框架中的Hashtable,Hashmap,Hashset,Hash表概念



我正在学习Java Collection框架并获得了调节的理解。现在,当我走得更远时,我对:HashMapHashSetHashtable

HashMap的Javadoc说:

基于Hash表的MAP接口实现。这 实施提供了所有可选的地图操作, 允许null值和空键。

HashSet的Javadoc说:

此类实现集合界面,由哈希表支持 (实际上是哈希图实例)。它不保证 集合的迭代顺序;特别是,它不能保证 随着时间的流逝,该订单将保持恒定。

Hashtable的Javadoc说:

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

所有这些实施hash table都是令人困惑的。他们是否实现了哈希表

的概念

看来所有这些都彼此相关,但我无法完全理解。

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

java的SetMap接口指定了两种非常不同的集合类型。Set听起来像是这样:一个不同的(非等于)对象的集合,没有其他结构。从概念上讲,Map也是听起来的样子:从一组对象(不同的键)到对象集合(值)的映射。HashtableHashMap都实现MapHashSet实现Set,并且它们都将集合中包含的键/对象用于提高性能。

HashtableHashMap

Hashtable是一个传统课程,几乎应该避免使用HashMap。它们基本上是同一件事,除了Hashtable中的大多数方法都同步,使单个方法调用线程安全。 1 ,如果您使用多个线程和多个线程和其他线程安全机制,则必须提供自己的同步或其他线程安全机制HashMap

Hashtable的问题是,将每个方法调用(这不是无关紧要的操作)同步通常是错误的。要么根本不需要同步,要么从应用程序逻辑的视图中,您需要在跨越多个方法调用的事务上同步。由于不可能在不破坏现有代码的情况下简单地从Hashtable中删除方法级同步,因此收集框架作者需要提出一个新类。因此HashMap。这也是一个更好的名称,因为很明显这是一种Map

哦,如果您确实需要方法级同步,则仍然不应使用Hashtable。相反,您可以调用Collections.synchronizedMap()将任何映射变成同步的地图。另外,您可以使用ConcurrentHashMap,根据文档:"遵守与Hashtable相同的功能规范"。但是具有更好的性能和其他功能(例如putIfAbsent())。

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

HashSet

在功能方面,HashSetHashMap无关。它恰好在内部使用HashMap实现Set功能。由于某种原因,收藏框架开发人员认为,将此内部实施详细信息的一部分是公共规范的一部分是一个好主意。(在我看来,这是一个错误。)

hashtable是一个旧类,是在Java具有仿制药之前创建的。它只是为了向后兼容。改用哈希图。

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

hashmap和Hashtable两个继承映射接口。并且具有相同的工作和属性。但是主要区别如下: -

1.hashmap是键和值对的无序地图。我们可以在hashmap中具有零键或值对。此外,hashmap不同步(即。时间。

2. hashtable: - 同步的hashmap(即。我们想与该钥匙联系在一起。然后将关键放置,然后将结果的哈希代码用作存储在表中的索引

3.HASHSET:-a HashSet继承设置接口,最终也基于Hashtable(或者我们只能说仅与hashmap连接到我们的hashmap),但是在这种情况下,键和值对始终是唯一的不允许的重复值。

在一个结论中,我们可以说所有三个集合都已经连接到映射接口和全部。

hashtable已同步,但hashmap却不是,但是却不是,但是您可以通过方法Collections.synchronizedmap()来制作hashmap同步。Hashtable,hashmap和Hashset基于哈希表数据结构进行了扭动。您可以使用一个NULL键,并且可以使用哪种hashmap的空值,但是HashTable不允许null键或空值。基本上,在标签下,正在工作hashmap,其中值是对象,因此标签值是唯一的,因为哈希图键是唯一的。因此,要将钥匙值对放入hashmap或hashtable或将元素放在标签上,您需要将键值对缩放到Ovveride HashCode并等于从对象类中的方法来纠正此实现的工作。这是因为在此实现下,有效的哈希表算法和哈希码,需要等于将值放在正确的存储桶中。重要的是要知道您需要用作钥匙字符串或任何其他包装器类,例如美国整数,这是因为此对象是不变的,它们可以成为此实现的好钥匙,或者您可以创建自己的不变类并将其用作钥匙。将不变的对象用作钥匙是一个好练习,因为创建后它们不能更改状态,因此hashcode始终相同。

最新更新