Java中的LinkedHashSet集合解读
LinkedHashSet介绍
LinkedHashSet是一个基于LinkedHashMap实现的有序去重集合列表。
- LinkedHashSet中的元素没有重复
- LinkedHashSet中的元素有顺序,维护了添加顺序
- LInkedHashSet可以存储null值
- LinkedHashSet是一个线程不安全的容器
以上是LinkedHashSet的类结构图:
- 继承了HashSet,所以它是在HashSet的基础上维护了元素添加顺序的功能
构造方法
LinkedHashSet()
说明: 创建一个空的容器列表,默认的初始容量为16,负载因子为0.75
LinkedHashSet(int initialCapacity, float loadFactor)
说明:创建一个指定初始容量和负载因子的容器
关键方法
public boolean add(E e)
说明:向集合中添加元素
public boolean remove(Object o)
说明:向集合中删除元素
public void clear()
说明:清空集合元素
public int size()
说明:返回集合中元素的数量
使用案例
验证LinkedHashSet的顺序性
@Test public void test1() { Set<Integer> set = new LinkedHashSet<>(); set.add(5); set.add(4); set.add(5); set.add(3); set.add(1); set.add(9); //正顺序遍历 System.out.print("遍历:"); set.forEach(item -> { System.out.print(item + " "); }); }
运行结果:
验证LinkedHashSet存储null值
@Test public void test2() { Set<Integer> set = new LinkedHashSet<>(); set.add(null); set.add(5); System.out.println(set); }
运行结果:
核心机制
底层有序性实现机制
LinkedHashSet底层是一个 LinkedHashMap,底层维护了一个数组+双向链表。
它根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序, 这使得元素看起来是以插入顺序保存的。
源码解析
本文主要从源码角度看下LinkedhashSet确实是依赖于LinkedHashMap,具体的逻辑还是要关注LinkedHashMap的实现。
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Serializable { public LinkedHashSet(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor, true); } public LinkedHashSet(int initialCapacity) { super(initialCapacity, .75f, true); } public LinkedHashSet() { super(16, .75f, true); } public LinkedHashSet(Collection<? extends E> c) { super(Math.max(2*c.size(), 11), .75f, true); addAll(c); } }
LinkedHashSet继承于HashSet,它的源码很少,只有几个构造函数,基本上都是调用父类HashSet的构造函数。
查看父类的构造函数,它是一个非public的构造函数,创建了一个LinkedHashMap, 所以说是依赖于LinkedHashMap实现的。
总结
LinkedHashSet主要适用于对于元素的添加顺序读取有要求的场景,比如FIFO这样的场景。
至于性能方面,大家也不用太过于担心,LinkedHashSet插入性能略低于HashSet,但在迭代访问set里面的全部元素时有很好的性能。
到此这篇关于Java中的LinkedHashSet集合解读的文章就介绍到这了,更多相关Java的LinkedHashSet内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringCloud Gateway HttpWebHandlerAdapter链路调用请求流程介
Spring Cloud Gateway旨在为微服务架构提供一种简单有效的、统一的 API 路由管理方式。Spring Cloud Gateway 作为 Spring Cloud 生态系中的网关,它不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全、监控/埋点和限流等2022-10-10Java 详解Collection集合之ArrayList和HashSet
本章具体介绍了ArrayList和HashSet两种集合的基本使用方法和区别,图解穿插代码实现。 JAVA成仙路从基础开始讲,后续会讲到JAVA高级,中间会穿插面试题和项目实战,希望能给大家带来帮助2022-03-03es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程详解
这篇文章主要介绍了es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-06-06Spring+SpringMVC+MyBatis深入学习及搭建(三)之MyBatis全局配置文件解析
这篇文章主要介绍了Spring+SpringMVC+MyBatis深入学习及搭建(三)之MyBatis全局配置文件解析,需要的朋友可以参考下2017-05-05SparkStreaming-Kafka通过指定偏移量获取数据实现
这篇文章主要为大家介绍了SparkStreaming-Kafka通过指定偏移量获取数据,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-06-06
最新评论