集合之HashSet
* HashSet
- HashSet无序不可重复,HashSet底层实际上是一个HashMap,HashMap底层采用了Hash表数据结构。
- 哈希表又叫做散列表,哈希表底层是数组加链表的数据结构, 数组的每一个元素都是一个单向链表,每一个单向链表都有一个独一无二的哈希值。某个单向链表中的每一个节点hash值相等。
- Hash值实际上是key值通过调用HashCode方法,再通过JHashFunction得出的hash值。
- 如何向Hash表中添加元素?
1. 先调用将要被存储的key的HashCode方法得出Hash值,如果该Hash值在现有Hash表中不存在,那么直接加入元素。
2. 如果该Hash值已经存在于当前hash表中,那么就需要继续调用key的equals方法,如果equals方法返回false,证明该key的值和哈希表中的值不相等,又因为Set集合的特定点是无序不可重复,所以只有Key值和
已存在于链表中的值不相等的情况下才能将该Key添加进去。
3. 如果key调用equal()方法返回true,证明key值和哈希表中现有的值存在重复,则放弃添加。
- HashSet是HashMap中的key部分,HashSet有什么样的特点那么HashMap中的key部分就有哪些特点。
- HashSet底层是HashMap,HashMap底层数组初始化容量是16,加载因子是0.75f(0.75指的是当元素占数组容量的百分之75的时候就进行扩容)
- 代码
```
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetText01 {
public static void main(String[] args) {
// 创建一个Set集合 HashSet初始化容量
Set set=new HashSet(); // 父类引用指向子类对象
// Set集合是无序不可重复的
set.add(1); //自动装箱
set.add(1); // 遍历输出发现 第二个 1 , 并没有加到Set集合中。
set.add("2021年4月3日");
set.add("12点16分");
set.add("星期六");
set.add("天气晴");
// 遍历Set集合 ,遍历集合发现,元素输出顺序和加载进去的顺序是不一样的,证明set集合确实是无序集合。
Iterator iterator= set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}