set接口的框架

 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 }

 

posted @ 2021-12-20 21:58  橘猫的夏天  阅读(29)  评论(0编辑  收藏  举报