Set接口的特点:
1.无序,添加和取出的顺序不一致,没有索引。但取出的顺序是固定的,按照固定的算法进行排序。
2.不允许添加重复元素,最多只能包含一个null
例如添加顺序为
set.add("yf");
set.add(null);
set.add(null);
set.add("jack");
set.add("yf");
set.add("lucy");
输出顺序却是
里面只包含一个null。
不管遍历多少次,这个顺序永远也不会变。
遍历方式:
//增强for循环底层其实也是用的迭代器
for (String string : set) {
System.out.println(string);
}
//迭代器方式
Iterator it = set.iterator();
while(it.hasNext()) {
String string = (String)it.next();
System.out.println(string);
}
HashSet其实就是HashMap通过HashSet的构造器可以看出来。
public HashSet() {
map = new HashMap<>();
}
而HashMap底层是数组加链表加红黑树。
就是这样的结构
HashMap在添加元素时,
先得到这个元素的hash值,然后转化为索引值,
通过索引值确定它在table表中的位置。
如果这个位置上没有元素,那就直接放到table表中,作为这个位置链表的头结点。
如果这个位置上有元素,调用equals比较,如果存在相同的,就放弃添加,如果不相同就添加到链表的尾部。
java8中如果链表的元素大于等于8个,且table数组的大小大于64就会转化成红黑树。