我正在学习Java Collection框架并获得了调节的理解。现在,当我走得更远时,我对:HashMap
,HashSet
,Hashtable
。
HashMap
的Javadoc说:
基于Hash表的MAP接口实现。这 实施提供了所有可选的地图操作, 允许null值和空键。
HashSet
的Javadoc说:
此类实现集合界面,由哈希表支持 (实际上是哈希图实例)。它不保证 集合的迭代顺序;特别是,它不能保证 随着时间的流逝,该订单将保持恒定。
Hashtable
的Javadoc说:
此类实现了一个哈希表,该表将键映射到值。任何 非零对象可以用作键或值。
所有这些实施hash table
都是令人困惑的。他们是否实现了哈希表?
看来所有这些都彼此相关,但我无法完全理解。
任何人都可以帮助我以简单的语言来理解这个概念。
java的Set
和Map
接口指定了两种非常不同的集合类型。Set
听起来像是这样:一个不同的(非等于)对象的集合,没有其他结构。从概念上讲,Map
也是听起来的样子:从一组对象(不同的键)到对象集合(值)的映射。Hashtable
和HashMap
都实现Map
,HashSet
实现Set
,并且它们都将集合中包含的键/对象用于提高性能。
Hashtable
和HashMap
Hashtable
是一个传统课程,几乎应该避免使用HashMap
。它们基本上是同一件事,除了Hashtable
中的大多数方法都同步,使单个方法调用线程安全。 1 ,如果您使用多个线程和多个线程和其他线程安全机制,则必须提供自己的同步或其他线程安全机制HashMap
。
Hashtable
的问题是,将每个方法调用(这不是无关紧要的操作)同步通常是错误的。要么根本不需要同步,要么从应用程序逻辑的视图中,您需要在跨越多个方法调用的事务上同步。由于不可能在不破坏现有代码的情况下简单地从Hashtable
中删除方法级同步,因此收集框架作者需要提出一个新类。因此HashMap
。这也是一个更好的名称,因为很明显这是一种Map
。
哦,如果您确实需要方法级同步,则仍然不应使用Hashtable
。相反,您可以调用Collections.synchronizedMap()
将任何映射变成同步的地图。另外,您可以使用ConcurrentHashMap
,根据文档:"遵守与Hashtable
相同的功能规范"。但是具有更好的性能和其他功能(例如putIfAbsent()
)。
1
还有其他差异(在我看来,不太重要),例如HashMap
支持null
值和键。
HashSet
在功能方面,HashSet
与HashMap
无关。它恰好在内部使用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始终相同。