1 package test;
2
3 import java.util.HashMap;
4 import java.util.HashSet;
5 import java.util.Iterator;
6 import java.util.Set;
7 import java.util.TreeSet;
8
9 import domain.Student;
10
11 public class SetDemo {
12 public static void main(String[] args) {
13 /*Set - 散列集合
14 * 1.称之为是一个散列集合
15 * 2.存储的元素是不重复的;如果添加重复元素,则会被覆盖
16 *
17 * HashSet - 哈希散列
18 * 1.HashSet存储元素的时候根据元素的哈希码来进行计算和存储的
19 * 2.HashSet底层是基于HashMap来存储的。
20 * 3.HashMap底层是依靠数组+链表存储,底层数组的初始容量是16
21 * 4.数组的每一个位置上维系一个链表结构
22 * 5.数组的每一个位置称之为一个bucket - 桶
23 * 列举一个哈希散列:
24 * ----------------------------------------------------------
25 * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
26 * o2 o1
27 * o3
28 * ----------------------------------------------------------
29 * 添加元素:
30 * o1 - 计算o1的哈希码 - 针对哈希码再次运算,使计算结果落在某个桶的编号上
31 * 放元素时,先拿这个元素和桶中已有的元素进行一一比较,如果当前元素和桶中的某个元素比较结果为true,则覆盖之前的元素
32 * 如果是false,将这个新元素插入当前列表的尾部
33 * 扩容机制:
34 * 当已经使用的桶的数量/桶的总数量>加载因子时,就会进行扩容。
35 * 加载因子:0.75F
36 * 每一次扩容增加一倍,底层基于左移来运算
37 * 扩容完成之后,所有的元素要重新计算重新分布-rehash(扩容)
38 * 减少rehash的次数:
39 * 1.增大初始容量
40 * 2.适当提高加载因子:0.6-0.8
41 * 6.同一个类的同一对象的哈希码一定是相同的,同一个类的不同对象哈希码一般是不同的
42 * 7.元素个数越多的时候,rehash的效率就越慢
43 * 8.加载因子越小,rehash的次数越大,同时导致空间的浪费;加载因子越大,在元素插入的过程中,比较次数越多
44 * 9.JDK1.8中,当桶中元素超过8个的时候,会将当前桶中的链表扭转成一个红黑树;当红黑树中的节点个数不足7个的时候,扭转回链表
45 *
46 * */
47 HashSet<String> H1 = new HashSet<>();
48 H1.add("衔春的燕想归巢");
49 H1.add("衔春的燕想归巢");
50 H1.add("燕归巢");
51 H1.add("岳阳楼");
52 System.out.println(H1);
53 HashMap<Integer,String> H2 = new HashMap<>();
54 H2.put(1, "十年之后");
55 H2.put(2, "我们是朋友");
56 H2.put(1, "还可以问候");
57 System.out.println(H2);
58 //遍历
59 Set<Integer> keySet = H2.keySet();
60 for (Integer integer : keySet) {
61 System.out.println(H2.get(integer));
62 }
63 System.out.println("-----------------------------");
64 Iterator<String> iterator = H1.iterator();
65 while (iterator.hasNext()) {
66 System.out.println(iterator.next());
67 }
68 /* TreeSet
69 * 1.会将放入其中的元素进行排序
70 * 2.要求所放入的元素所对应的类必须实现Comparable接口
71 * 3.TreeSet在底层采用的是二叉树结构
72 * 4.TreeSet在放入元素的时候,实际上会跟元素进行比较,而在比较的时候调用的不是equals而是compareTo方法
73 * */
74 TreeSet<Student> T1 = new TreeSet<>();
75 Student S1 = new Student(1,18,"男");
76 Student S2 = new Student(2,19,"男");
77 Student S3 = new Student(3,17,"女");
78
79 T1.add(S3);
80 T1.add(S2);
81 T1.add(S1);
82 System.out.println(T1);
83
84 }
85 }