HashSet的存储原理,主要从如何保证唯一性谈起
首先说明一点,HashSet 底层采用了 HashMap 来实现存储,HashSet的值作为HashMap的key进行存储
private transient HashMap<E,Object> map;
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
HashSet 底层采用的是数组来实现
transient Node<K,V>[] table;
在存储一个值的时候,会对这个值计算hash值,在对hash值跟数组长度-1 进行 & 操作,得到这个值在这个数组中的位置,然后对这个值进行存储。
如果这个位置没有元素,这个值会直接存进去
如果这个位置已经存在元素了,这里可能挂载的是一个链表,也可能是一个红黑树,这时会依次对这个位置上的元素进行比较。
如果元素已经存在,则替换原来的值,如果元素没有存在,则会添加到这个位置,在添加的时候会进行一个判断,如果这个位置的元素个数 >= 8 则将这个位置的结构转换成为一棵红黑树。