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 }