/** * |---HashSet:Set接口的主要实现类,线程不安全,可以存储null值 * |---LinkedHashSet:作为HashSet的子类,遍历其内部数据时可以按照添加的顺序遍历 * |---TreeSet:可以按照指定属性的方法进行排序 * Set中添加的元素一定要重写equals和HashCode方法 * * @author Baobao * @create 2021-08-13 18:21 */ public class SetTest { /* set无序,不可重复。 如何理解他的无序性?以HashSet说明 1.无序性:不等于随机性 存储的数据在底层的数组中不一定是按照索引的顺序添加。 而是根据数据的哈希值进行排序 2.不可重复性:保证添加的元素按照equals方法判断时不能返回true 添加元素的过程:以HashSet为例 添加元素A: 调用元素A所在类的HashCode方法,计算哈希值,通过某种算法计算出在 底层数组的存放位置:即,索引位置;判断数组此位置上是否已经有元素, 如果,这个位置上没有其他元素,则元素A直接添加;如果有其他元素B,或者 已经存在以链表形式存储的多个元素,首先比较元素A和元素B的哈希值,如果 哈希值不相同,则A添加成功,如果哈希值相同,就调用A所在类的equals方法 ,返回true就表示A添加失败;如果返回false,则元素A添加成功,以链表 顺序存储 LinkedHashSet: 作为HashSet的子类,在添加数据的同时还维护了两个引用,记录前驱和后继 对于频繁的遍历操作,效率更高。 TreeSet: 添加进去的元素得是相同类的对象 */ @Test public void test01(){ Set set=new HashSet(); } }