1 package settest; 2 3 import listtest.Person; 4 import org.junit.Test; 5 6 import java.util.HashSet; 7 import java.util.Iterator; 8 import java.util.LinkedHashSet; 9 import java.util.Set; 10 11 /** 12 * 1.set接口的框架 13 * /----Collection接口:单列集合,用来存储一个一个的对象 14 * /----Set接口:存储无序的、不可重复的数据。--->高中讲的 “集合” 15 * /----HashSet:作为Set接口的主要实现类;线程不安全的;可以存储null值 16 * /----LinkedHashSet:作为HashSet的子类,遍历其内部数据时,可以按照添加的顺序遍历 17 * 对于频繁的遍历操作,LinkedHashSet效率高于HashSet 18 * /----TreeSet:可以按照添加对象的属性,进行排序。放入TreeSet中的数据,必须是同一个类new的对象。 19 * 20 * 2.Set接口中没有额外定义新的方法,使用的都是Collection中定义过的。 21 * 3.要求:①向Set中添加的数据,其所在类必须重写equals()和hashCode() 22 * ②重写的equals()和hashCode()方法尽可能保持一致性,即 “相等的对象必须具有相等的散列码” 23 * 重写两个方法的小技巧:对象中用作equals()方法比较的Field,都应该用来计算hashCode, 24 * 25 * @author FuJingchao 26 * @Date: 2021/12/18 - 15:55 27 */ 28 public class SetTest { 29 /* 30 一、Set:存储无序,不可重复的数据 31 以HashSet为例说明: 32 1.无序性:不等于随机性,存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数组的哈希值决定的。 33 34 2.不可重复性:保证添加的元素按照equals()方法判断时,不能返回true,即:相同的元素只能添加一个 35 36 二、添加元素的过程(HashSet底层:数组加链表的结构):以HashSet为例: 37 1.我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,去计算元素a的哈希值,此哈希值接着通过某种算法,计算出在HashSet底层 38 数组中的存放位置(即为相应的索引位置),判断数组此位置是否已经有元素: 39 ①如果此位置上没有其他元素,则添加成功。----->情况1 40 ②如果此位置上有其他元素b(或以链表形式存在多个),首先比较元素a与元素b的哈希值: 41 若哈希值不相同,则元素a添加成功。----->情况2 42 若哈希值相同,则需要调用元素a所在的equals(): 43 equals()返回true,则元素a添加失败 44 equals()返回false,则元素a添加成功。----->情况3 45 46 对于添加成功的情况2和情况3而言:元素a与已经存在索引位置上的数据以链表方式存储。 47 对于jdk7:新元素a放在数组中,指向元素b 48 对于jdk8:元素b放在数组中,指向新元素a 49 50 51 */ 52 53 @Test 54 public void test1(){ 55 Set set = new HashSet(); 56 set.add(456); 57 set.add(123); 58 set.add("AA"); 59 set.add(777); 60 set.add(new Person("Tom",12)); 61 set.add(new Person("Tom",12)); 62 set.add("CC"); 63 64 Iterator iterator = set.iterator(); 65 while (iterator.hasNext()){ 66 System.out.println(iterator.next()); 67 } 68 69 } 70 71 //LinkedHashSet的使用 72 //LinkedHashSet作为Hash的子类,在添加数据的同时,每个数据还维护了两个引用,记录此数据的前一个数据和后一个数据。 73 //优点:对于频繁的遍历操作,LinkedHashSet效率高于HashSet 74 @Test 75 public void test2(){ 76 Set set = new LinkedHashSet(); 77 set.add(456); 78 set.add(123); 79 set.add("AA"); 80 set.add(777); 81 set.add(new Person("Tom",12)); 82 set.add(new Person("Tom",12)); 83 set.add("CC"); 84 85 Iterator iterator = set.iterator(); 86 while (iterator.hasNext()){ 87 System.out.println(iterator.next()); 88 } 89 90 } 91 92 }