Set_0">1.HashSet底层储蓄原理
HashSet底层采用的是HashMap来实现存储,其值作为HashMap的key
HashSet<Character> hashSet = new HashSet<Character>();
hashSet.add('x');
//add底层源码
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
//put底层源码
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
hashset中不会存放相同的元素,那么它就要采用hash算法,通过计算存储对象的hashcode得到一个int型的值,然后再与数组的长度做位运算,得到在数组中储蓄的位置,,如果此时计算的位置没有其他元素,直接储存,不用比较。随着元素的增加,就可能发生“哈希冲突”,不同对象计算出来的值是相同的,这时我们就要用equals方法比较,如果相同则不插入,否则插入形成链表(算法中的拉链法) ,但是随着元素的继续增加,链可能会更长,在JD1.8版本之后优化为红黑树