欢迎光临散文网 会员登陆 & 注册

150天打卡Day25_集合深度解析 - Set接口

2021-05-18 11:41 作者:关阿姨的Java日记  | 我要投稿

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()


150天打卡Day25_集合深度解析 - Set接口的评论 (共 条)

分享到微博请遵守国家法律