table 集合框架中的 Hashtable, HashMap, HashSet , hash table 概念
Hashtable, HashMap, HashSet , hash table concept in Java collection framework
我正在学习 Java Collection Framework 并获得了适度的理解。现在,当我走得更远时,我对以下内容产生了一些疑问:HashMap
、HashSet
、Hashtable
.
HashMap
的 Java 文档说:
Hash table based implementation of the Map interface. This
implementation provides all of the optional map operations, and
permits null values and the null key.
HashSet
的 Java 文档说:
This class implements the Set interface, backed by a hash table
(actually a HashMap instance). It makes no guarantees as to the
iteration order of the set; in particular, it does not guarantee that
the order will remain constant over time.
Hashtable
的 Java 文档说:
This class implements a hash table, which maps keys to values. Any
non-null object can be used as a key or as a value.
令人困惑的是,它们都实现了 hash table
。他们是否实现了散列table的概念?
这些似乎都是相互关联的,但我无法完全理解。
谁能用简单的语言帮助我理解这个概念。
哈希表是在 Java 具有泛型之前创建的旧 class。它只是为了向后兼容而存在。请改用 HashMap。
当您不需要将键映射到值时使用 HashSet。它基于与哈希表相同的算法构建,但用于根本不同的目的。
Java 的 Set
和 Map
接口指定了两种截然不同的集合类型。 Set
顾名思义:不同(不相等)对象的集合,没有其他结构。从概念上讲,Map
也正是它听起来的样子:从一组对象(不同的键)到一组对象(值)的映射。 Hashtable
和 HashMap
都实现了 Map
,HashSet
实现了 Set
,它们都使用集合中包含的 keys/objects 的哈希码来提高性能.
Hashtable
和 HashMap
Hashtable
是遗留的 class,几乎总是应该避免使用 HashMap
。它们本质上做同样的事情,除了 Hashtable
中的大多数方法是同步的,使单个方法调用线程安全。1 您必须提供自己的同步或其他线程安全机制如果您使用多线程并且 HashMap
.
Hashtable
的问题是同步每个方法调用(这是一个重要的操作)通常是错误的。您要么根本不需要同步,要么从应用程序逻辑的角度来看,您需要对跨越多个方法调用的事务进行同步。由于不可能在不破坏现有代码的情况下简单地从 Hashtable
中删除方法级同步,因此 Collections 框架作者需要提出一个新的 class;因此 HashMap
。它也是一个更好的名字,因为很明显它是一种 Map
.
哦,如果确实需要方法级同步,还是不要用Hashtable
。相反,您可以调用 Collections.synchronizedMap()
to turn any map into a synchronized one. Alternatively, you can use ConcurrentHashMap
, which, according to the docs: "obeys the same functional specification as Hashtable
" 但具有更好的性能和附加功能(例如 putIfAbsent()
)。
1 还有其他差异(在我看来不太重要),例如 HashMap
支持 null
值和键。
HashSet
就功能而言,HashSet
与HashMap
无关。它恰好在内部使用了一个 HashMap
来实现 Set
功能。出于某种原因,集合框架开发人员认为将此内部实现细节作为 class 的 public 规范的一部分是个好主意。 (在我看来,这是一个错误。)
HashMap 和 HashTable 都继承了 Map interface.and 和 properties.But 的工作原理几乎相同,主要区别如下:-
1.Hashmap 是键和值的无序映射 pairs.And 我们可以在 hashmap.Also 中包含空键或值对,哈希映射是不同步的(即不是线程安全的多线程可以同时访问和修改它。)但是我们可以在外部制作一个hashmap线程-safe.So如果不考虑同步问题那么hashmap是更可取的。
2.HashTable:- 一个同步的 hashMap(即线程安全的 hashmap)。但是在这种情况下,键和值对永远不会是 null.In 一个 Hashtable 我们指定一个用作键的对象,以及我们要关联到该键的值。然后对密钥进行哈希处理,生成的哈希码用作索引,值存储在 table
中
3.HashSet:-A hashset 继承 set 接口,最后它也基于 hashtable(或者我们可以说仅与我们的 hashmap 深度连接)但在这种情况下,键的和值对始终是唯一的没有重复值 allowed.but 空键值 allowed.Objects 根据其哈希码插入。
总而言之,我们可以说所有三个集合都已连接到 Map 接口。
Hashtable 是同步的,但 HashMap 不是,但是您可以借助 Collections.synchronizedMap() 方法使 HashMap 同步。 Hashtable、HashMap、HashSet都是基于HashTable数据结构实现的。您可以为 HashMap 使用一个空键和您想要的空值类型,但 Hashtable 不允许空键或空值。基本上在 HashSet 下工作的是 HashMap,其中值是 Object 因此 HashSet 值是唯一的,因为 HashMap 键是唯一的。因此,为了将键值对放入 Hashmap 或 Hashtable 或将元素放入 HashSet,您需要从 Object class 中 ovveride hashcode 和 equals 方法来纠正此实现的工作。这是因为在此实现下,正在运行 Hash Table 算法和哈希码,需要 equals 才能将值放入正确的存储桶中。重要的是要知道您需要使用 String 或任何其他包装器 class 作为 Integer 之类的键,这是因为此对象是不可变的,它们可以是此实现的好键,或者您可以创建自己的不可变 class 并将其用作密钥。使用不可变对象作为键是一种很好的做法,因为在创建之后它们不能改变它们的状态因此哈希码总是相同的。
我正在学习 Java Collection Framework 并获得了适度的理解。现在,当我走得更远时,我对以下内容产生了一些疑问:HashMap
、HashSet
、Hashtable
.
HashMap
的 Java 文档说:
Hash table based implementation of the Map interface. This implementation provides all of the optional map operations, and permits null values and the null key.
HashSet
的 Java 文档说:
This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time.
Hashtable
的 Java 文档说:
This class implements a hash table, which maps keys to values. Any non-null object can be used as a key or as a value.
令人困惑的是,它们都实现了 hash table
。他们是否实现了散列table的概念?
这些似乎都是相互关联的,但我无法完全理解。
谁能用简单的语言帮助我理解这个概念。
哈希表是在 Java 具有泛型之前创建的旧 class。它只是为了向后兼容而存在。请改用 HashMap。
当您不需要将键映射到值时使用 HashSet。它基于与哈希表相同的算法构建,但用于根本不同的目的。
Java 的 Set
和 Map
接口指定了两种截然不同的集合类型。 Set
顾名思义:不同(不相等)对象的集合,没有其他结构。从概念上讲,Map
也正是它听起来的样子:从一组对象(不同的键)到一组对象(值)的映射。 Hashtable
和 HashMap
都实现了 Map
,HashSet
实现了 Set
,它们都使用集合中包含的 keys/objects 的哈希码来提高性能.
Hashtable
和 HashMap
Hashtable
是遗留的 class,几乎总是应该避免使用 HashMap
。它们本质上做同样的事情,除了 Hashtable
中的大多数方法是同步的,使单个方法调用线程安全。1 您必须提供自己的同步或其他线程安全机制如果您使用多线程并且 HashMap
.
Hashtable
的问题是同步每个方法调用(这是一个重要的操作)通常是错误的。您要么根本不需要同步,要么从应用程序逻辑的角度来看,您需要对跨越多个方法调用的事务进行同步。由于不可能在不破坏现有代码的情况下简单地从 Hashtable
中删除方法级同步,因此 Collections 框架作者需要提出一个新的 class;因此 HashMap
。它也是一个更好的名字,因为很明显它是一种 Map
.
哦,如果确实需要方法级同步,还是不要用Hashtable
。相反,您可以调用 Collections.synchronizedMap()
to turn any map into a synchronized one. Alternatively, you can use ConcurrentHashMap
, which, according to the docs: "obeys the same functional specification as Hashtable
" 但具有更好的性能和附加功能(例如 putIfAbsent()
)。
1 还有其他差异(在我看来不太重要),例如 HashMap
支持 null
值和键。
HashSet
就功能而言,HashSet
与HashMap
无关。它恰好在内部使用了一个 HashMap
来实现 Set
功能。出于某种原因,集合框架开发人员认为将此内部实现细节作为 class 的 public 规范的一部分是个好主意。 (在我看来,这是一个错误。)
HashMap 和 HashTable 都继承了 Map interface.and 和 properties.But 的工作原理几乎相同,主要区别如下:-
1.Hashmap 是键和值的无序映射 pairs.And 我们可以在 hashmap.Also 中包含空键或值对,哈希映射是不同步的(即不是线程安全的多线程可以同时访问和修改它。)但是我们可以在外部制作一个hashmap线程-safe.So如果不考虑同步问题那么hashmap是更可取的。
2.HashTable:- 一个同步的 hashMap(即线程安全的 hashmap)。但是在这种情况下,键和值对永远不会是 null.In 一个 Hashtable 我们指定一个用作键的对象,以及我们要关联到该键的值。然后对密钥进行哈希处理,生成的哈希码用作索引,值存储在 table
中3.HashSet:-A hashset 继承 set 接口,最后它也基于 hashtable(或者我们可以说仅与我们的 hashmap 深度连接)但在这种情况下,键的和值对始终是唯一的没有重复值 allowed.but 空键值 allowed.Objects 根据其哈希码插入。
总而言之,我们可以说所有三个集合都已连接到 Map 接口。
Hashtable 是同步的,但 HashMap 不是,但是您可以借助 Collections.synchronizedMap() 方法使 HashMap 同步。 Hashtable、HashMap、HashSet都是基于HashTable数据结构实现的。您可以为 HashMap 使用一个空键和您想要的空值类型,但 Hashtable 不允许空键或空值。基本上在 HashSet 下工作的是 HashMap,其中值是 Object 因此 HashSet 值是唯一的,因为 HashMap 键是唯一的。因此,为了将键值对放入 Hashmap 或 Hashtable 或将元素放入 HashSet,您需要从 Object class 中 ovveride hashcode 和 equals 方法来纠正此实现的工作。这是因为在此实现下,正在运行 Hash Table 算法和哈希码,需要 equals 才能将值放入正确的存储桶中。重要的是要知道您需要使用 String 或任何其他包装器 class 作为 Integer 之类的键,这是因为此对象是不可变的,它们可以是此实现的好键,或者您可以创建自己的不可变 class 并将其用作密钥。使用不可变对象作为键是一种很好的做法,因为在创建之后它们不能改变它们的状态因此哈希码总是相同的。