150天打卡Day25_集合深度解析 - Set接口
Collection子接口之二:Set接口
Set接口没有提供额外的方法,使用Collection里的方法
Set集合无序不可重复,如果试着把两个相同的元素加同一个set集合,则操作失败
Set判断两个对象是否相同不用==,用equals()方法
无序性和不可重复性的理解
无序性
不等于随机性,以HashSet为例说明
存储的数据不按照数组索引的顺序挨个添加,而是根据添加元素的哈希值决定添加在数组的存储位置
不可重复性
保证添加的元素按照equas()方法判断时,不能返回true,即相同的元素只能添加一个
HashSet,LinkedHashSet,TreeSet异同
相同
均实现了Set接口,拥有Set接口所有的特性
不同
HashSet:是Set接口的主要实现类,线程不安全,可以存储null值
LinkedHashSet:作为HashSet的子类,由于链表的关系,遍历其内部数据时,可以按添加顺序去遍历
TreeSet:底层是红黑树,添加时只能添加同一个类new的对象,可以按照添加对象的指定属性进行排序
HashSet源码分析
HashSet特点介绍
HashSet底层结构是数组加链表,
HashSet元素添加过程
我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,根据此哈希值通过某种算法计算出在HashSet底层存放的位置,判断在该位置上是否已经有元素
如果该位置上没有元素,那么元素a添加成功
如果该位置上有其他元素,或以链表形式存在的多个元素,则比较元素a与这些元素的哈希值,如果哈希值不相同,以链表的形式追加到后面,如果哈希值相同,则还要调用元素a所在类的equals()方法进行判断,返回true则证明相同,添加失败,返回false则证明不相同,则以链表的形式追加到后面
底层HashSet添加元素其实是添加了HashMap的key,value是定义的一个静态常量,没有实际意义
HashSet底层其实就是HashMap,其他Set实现类同理
LinkedHashSet源码分析
LinkedHashSet作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,记录此数据前一个数据和后一个数据,优点,对于频繁的遍历操作,优于HashSet
TreeSet源码分析
添加时只能添加同一个类new的对象,可以按照添加对象的指定属性进行排序
两种排序方式,自然排序和定制排序
自然排序中,TreeSet比较两个对象是否相同的标准为compareTo()方法返回0,不再是equals()