本篇内容包括:HashSet 概述、HashSet 与 HashMap 的关系以及HashSet 的使用
一、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代码:
private transient HashMap map;
public HashSet()
{
map = new HashMap();
}
public HashSet(int initialCapacity)
{
map = new HashMap(initialCapacity);
}
private static final Object PRESENT = new Object();
而 HashSet 类的 add 方法的实现是这样子的,很明显可以看到是调用了 HashMap 里的 put() 方法。而里面的 present 则是常量,就是没用的。
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() | 获得大小 |
|