我们都知道hashset是set接口的实现类,set的特点是无序、唯一,使用起来也很简单无脑,但hashset底层是怎么实现的?如何保证它的唯一性呢?那我们就一起来探讨一下hashset数据结构的底层结构。
进入hashset类的源码发现,它的构造方法里维护了一个hashmap。
public HashSet()
{
map = new HashMap<>();
}
再看一下它的add方法,发现hashset的add方法,就是调用hashmap的put方法,插入的对象为key,PRESENT为value(PRESENT就是一个空的Object对象)
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
那为啥hashset的元素唯一?
因为当hashset在调用add方法添加元素时,会调用hashmap的put方法,以插入的对象为key,在hashmap的put方法中,会调用hashcode方法计算出哈希值,然后再通过按位与运算(length-1)&hashcode,计算出数组下标,然后通过equals方法来判断元素是否存在,如果存在,则替换,如果不存在,就插入元素。