Live2D

JAVA-集合-Set

 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 }

 

posted @ 2019-10-09 12:49  Mr丶L  阅读(221)  评论(0编辑  收藏  举报