文字描述
1) HashSet底层是HashMap
2)添加一个元素时,先得到hash值-会转成->索引值
3) 找到存储数据表table,看这个索引位置是否已经存放的有元素
4) 如果没有,直接加入
5) 如果有,调用equals比较,如果相同,就放弃添加,如桑不相同,则添加到最后
6) 在Java8中,如果一条链表的元素个数超过TREEIFY_THRESHOLD(默认是8),并且table的大小>=MINTREEIFY_CAPACITY(默认64),就会进行树化(红黑树)
HashSetSource.java代码描述了HashSet底层机制
package com.hspedu.set_;
public class HashSetStructure {
public static void main(String[] args) {
//1.创建一个数组,数组的类型是 Node[]
//2.有些人,直接把 Node[]数组称为表
Node[] table = new Node[16];
//3. 创建节点
Node john = new Node("john", null);
table[2] = john;
Node jack = new Node("jack", null);
john.next = jack; // 将jack 节点挂载刀john
Node rose = new Node("Rose", null);
jack.next = rose; // 将rose 节点挂载到jack
Node lucy = new Node("lucy",null);
table[3] = lucy; // 将lucy放在 table表的索引为3的位置
System.out.println("table=" + table);
}
}
class Node {
Object item; //存放数据
Node next; //指向下一个节点
public Node(Object item, Node next) {
this.item = item;
}
}