暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java集合详解Set接口-HashSet、LinkedHashSet、TreeSet解析

老胡的技术笔记 2021-03-14
235

Set接口:不允许重复存储元素

HashSet为例:看一下关系图

HashSet中的add()方法实现:

原来,在HashSet中定义了两个变量:

实际执行的是map方法,并且当我们添加的对象是map中的key,value是执行的统一对象PRESENT其底层是HashMap实现。

HashSet构造方法:

第1种:默认构造函数,初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75。

第2种:构造一个包含指定 collection 中的元素的新 set。

第3种:构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子


第4种:构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。

第5种:不对外公开的,以指定的initialCapacity和loadFactor构造一个新的空链接哈希集合。dummy 为标识 该构造函数主要作用是对LinkedHashSet起到一个支持作用

从构造函数中可以看出HashSet所有的构造都是构造出一个新的HashMap,其中最后一个构造函数,为包访问权限是不对外公开,仅仅只在使用LinkedHashSet时才会发生作用。

LinkedHashSet关系图:

可以看出LinkedHashSet继承自HashSet,LinkedHashSet是HashSet的一个“扩展版本”,HashSet并不管什么顺序,不同的是LinkedHashSet会维护“插入顺序”。HashSet内部使用HashMap对象来存储它的元素,而LinkedHashSet内部使用LinkedHashMap对象来存储和处理它的元素。

LinkedHashSet的构造方法:

在LinkedHashSet类中一共有4个构造函数。这些构造函数都只是简单地调用父类构造函数。

第1种:

第2种:

第3种:

第4种:

这个构造函数需要初始容量,负载因子和一个boolean类型的值等参数。这个boolean参数只是用来区别这个构造函数与HashSet的其他拥有初始容量和负载因子参数的构造函数。参考HashSet构造方法第5种。唯一的不同是内部使用不同的对象去存储元素。在HashSet中,插入的元素是被当做HashMap的键来保存的,而在LinkedHashSet中被看作是LinkedHashMap的键。这些键对应的值都是常量PRESENT(PRESENT是HashSet的静态成员变量)。

TreeSet关系图:

TreeSet中的add()方法实现同HashSet,只不过在TreeSet中的Map变成了NavigableMap:

与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的,我们知道TreeMap是一个有序的二叉树,那么同理TreeSet同样也是一个有序的,它的作用是提供有序的Set集合。通过源码我们知道TreeSet基础AbstractSet,实现NavigableSet、Cloneable、Serializable接口。

其中AbstractSet提供 Set 接口的主要实现,从而最大限度地减少了实现此接口所需的工作。

NavigableSet是扩展的 SortedSet,具有了为给定搜索目标报告最接近匹配项的导航方法,这就意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。Cloneable支持克隆,Serializable支持序列化。

TreeSet构造方法:

第1种:默认构造方法,根据其元素的自然顺序进行排序


第2种:构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。

第3种:构造一个新的空 TreeSet,它根据指定比较器进行排序。


第4种:构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。



Set接口:不允许重复存储元素

这里说的顺序有两个概念,一是按添加的顺序排列,二是按自然顺序 a-z 排列。Set 并不是无序的,传统说的:Set 无序是指 HashSet, 它不能保证元素的添加顺序,更不能保证自然顺序,而 Set 的其他实现类是可以实现这两种顺序的。

示例:

我们发现 Set 所谓的无序就是在 HashSet 这个实现类中才会出现的这种情况,LinkedHashSet 已经和 List 的结果相同了,再看 TreeSet 实现的功能是根据元素的自然顺序排列了。


文章转载自老胡的技术笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论