• LinkedHashSet详解


    概述

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

    说明:返回集合中元素的数量

    使用案例

    1. 验证LinkedHashSet的顺序性
    1. @Test
    2. public void test1() {
    3. Set set = new LinkedHashSet<>();
    4. set.add(5);
    5. set.add(4);
    6. set.add(5);
    7. set.add(3);
    8. set.add(1);
    9. set.add(9);
    10. //正顺序遍历
    11. System.out.print("遍历:");
    12. set.forEach(item -> {
    13. System.out.print(item + " ");
    14. });
    15. }


    运行结果:

    2.验证LinkedHashSet存储null值 

    1. @Test
    2. public void test2() {
    3. Set set = new LinkedHashSet<>();
    4. set.add(null);
    5. set.add(5);
    6. System.out.println(set);
    7. }

     运行结果:

     

    核心机制

    底层有序性实现机制

    LinkedHashSet底层是一个 LinkedHashMap,底层维护了一个数组+双向链表。它根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序, 这使得元素看起来是以插入顺序保存的。

    源码解析

    本文主要从源码角度看下LinkedhashSet确实是依赖于LinkedHashMap,具体的逻辑还是要关注LinkedHashMap的实现。

     

    1. public class LinkedHashSet
    2. extends HashSet
    3. implements Set, Cloneable, java.io.Serializable {
    4. public LinkedHashSet(int initialCapacity, float loadFactor) {
    5. super(initialCapacity, loadFactor, true);
    6. }
    7. public LinkedHashSet(int initialCapacity) {
    8. super(initialCapacity, .75f, true);
    9. }
    10. public LinkedHashSet() {
    11. super(16, .75f, true);
    12. }
    13. public LinkedHashSet(Collection c) {
    14. super(Math.max(2*c.size(), 11), .75f, true);
    15. addAll(c);
    16. }
    17. }

     

    • LinkedHashSet继承于HashSet,它的源码很少,只有几个构造函数,基本上都是调用父类HashSet的构造函数。
    • 查看父类的构造函数,它是一个非public的构造函数,创建了一个LinkedHashMap, 所以说是依赖于LinkedHashMap实现的。


    总结

    LinkedHashSet主要适用于对于元素的添加顺序读取有要求的场景,比如FIFO这样的场景。

    至于性能方面,大家也不用太过于担心,LinkedHashSet插入性能略低于HashSet,但在迭代访问set里面的全部元素时有很好的性能。

     

  • 相关阅读:
    猿创征文|【云原生 | 24】Docker运行数据库实战之MongoDB
    40.【C++最全文件操作,少一个你打我】
    ruoyi-nbcio-plus基于vue3的flowable收回任务后重新进行提交表单的处理
    体验facechain
    可交互提示Snackbar
    【Linux】进程间通信
    [NOIP2003 普及组] 乒乓球
    公司招了一个腾讯拿30K的人,让我见识到了什么是天花板···
    【浅学Java】详解网络层IP协议
    有没有在网狐上班的啊?有大生意
  • 原文地址:https://blog.csdn.net/m0_73088370/article/details/126571654