版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzl1369248650/article/details/82428990
1. 简介
jdk原注解:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
hashSet是无序、不重复的队列,能够快速查找。那么它为什么是无序、不重复的呢?看源码解析
2. 源码
hashSet的数据都是存储在其内部的map当中的,在其创建的时候初始化map
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
static final long serialVersionUID = -5024744406713321676L;
//内部数据存储
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<>();
}
新增的时候就是将数据放入map的Key中,而map的value固定都是Object。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
这时候就很清楚了,为什么hashSet是无序、不重复的。因为hashMap的存储就是无序、不重复的(相同的key会覆盖)。
那么为什么hashSet查找效率要比数组和链表快呢?因为hashMap的链表头部是根据hash散列的,那么查找的时候直接进行hash定位就行了,不需要每个元素都遍历。