哈希表存放的是哈希值, HashSet 存储元素的顺序并不是按照存入时的顺序(和 List 显然不同) 而是按照哈希值来存的所以取数据也是按照哈希值取得。 ~ 本篇内容包括:HashSet 概述、HashSet 与 HashMap 的关系以及HashSet 的使用
文章目录- 一、HashSet 概述
- 二、HashSet 与 HashMap
- 三、HashSet 的使用
- 1、构造方法
- 2、常用方法
- 1、构造方法
- 2、常用方法
一、HashSet 概述
哈希表存放的是哈希值, HashSet 存储元素的顺序并不是按照存入时的顺序(和 List 显然不同) 而是按照哈希值来存的所以取数据也是按照哈希值取得。元素的哈希值是通过元素的 hashcode 方法来获取的, HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较 equals 方法 如果 equls 结果为 true , HashSet 就视为同一个元素。如果 equals 为 false 就不是同一个元素。哈希值相同 equals 为 false 的元素是怎么存储呢,就是在同样的哈希值下顺延(可以认为哈希值相同的元素放在一个哈希桶中)。也就是哈希一样的存一列。
HashSet 通过 hashCode 值来确定元素在内存中的位置。一个 hashCode 位置上可以存放多个元素。
HashSet 的底层源码特别少,主要是因为 HashSet 的方法基本都是借助 HashMap 的方法来实现的。 HashSet 存储的元素对应 HashMap 的 key,因为 HashMap 不能存储重复的 key,所以 HashSet 不能存放重复元素;由于 HashMap 的 key 是基于 hashCode 存储对象的,所以 HashSet 中存放的对象也是无序的;HashSet 也没有提供 get 方法,可以通过 Iterator 迭代器获取数据。
二、HashSet 与 HashMap
HashSet 是基于 HashMap 实现的,区别就在于在 HashMap 中输入一个键值对,而在 HashSet 中只输入一个值。
Java代码:
代码语言:javascript复制private transient HashMap map;
// Constructor - 1
// All the constructors are internally creating HashMap Object.
public HashSet()
{
// Creating internally backing HashMap object
map = new HashMap();
}
// Constructor - 2
public HashSet(int initialCapacity)
{
// Creating internally backing HashMap object
map = new HashMap(initialCapacity);
}
// Dummy value to associate with an Object in Map
private static final Object PRESENT = new Object();
而 HashSet 类的 add 方法的实现是这样子的,很明显可以看到是调用了 HashMap 里的 put() 方法。而里面的 present 则是常量,就是没用的。
代码语言:javascript复制public boolean add(E e)
{
return map.put(e, PRESENT) == null;
}
三、HashSet 的使用
1、构造方法
HashSet 提供了五种方式的构造器,其中 4 种是 public 修饰的:
方法名 | 方法说明 | 方法名 | 方法说明 |
---|---|---|---|
public HashSet() | 无参构造方法,完成 map 的创建; | public HashSet(int initialCapacity) | 指定初始化大小 |
public HashSet(int initialCapacity, float loadFactor) | 指定初始化大小,和负载因子 | public HashSet(Collection) | 定集合转化为 HashSet, 完成 map 的创建 |
HashSet(int initialCapacity, float loadFactor, boolean dummy) | 指定初始化大小和负载因子,dummy 无实际意义 |
2、常用方法
方法名 | 方法说明 | 方法名 | 方法说明 |
---|---|---|---|
boolean add(E e) | 添加一个元素,如果该元素已经存在,则返回true,如果不存在,则返回false | boolean remove(Object o) | 删除指定的元素,删除成功返回true |
Iterator<E> iterator() | 获取hashSet的迭代器 | int size() | 获得大小 |