Java中的LinkedHashSet集合解读

 更新时间:2023年09月04日 11:20:20   作者:C陈三岁  
这篇文章主要介绍了Java中的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()

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

使用案例

验证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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现双向链表(两个版本)

    Java实现双向链表(两个版本)

    这篇文章主要介绍了Java实现双向链表(两个版本)的相关资料,需要的朋友可以参考下
    2016-02-02
  • 为什么Java开发需要配置环境变量

    为什么Java开发需要配置环境变量

    这篇文章主要介绍了为什么Java开发需要配置环境变量,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-08-08
  • Javaweb应用使用限流处理大量的并发请求详解

    Javaweb应用使用限流处理大量的并发请求详解

    这篇文章主要介绍了Javaweb应用使用限流处理大量的并发请求详解,还是挺不错的,这里分享给大家,供需要的朋友参考。
    2017-11-11
  • 菜鸟学习java设计模式之单例模式

    菜鸟学习java设计模式之单例模式

    这篇文章主要为大家详细介绍了java设计模式之单例模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • springboot+vue项目从第一行代码到上线部署全流程

    springboot+vue项目从第一行代码到上线部署全流程

    本文详细介绍了如何从零开始搭建一个基于Spring Boot和Vue.js的前后端分离项目,并涵盖项目需求分析、技术选型、项目结构设计、前后端交互、部署上线等全过程,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • java 回调机制的实例详解

    java 回调机制的实例详解

    这篇文章主要介绍了java 回调机制的实例详解的相关资料,希望通过本文的示例能帮助到大家理解使用回调机制,需要的朋友可以参考下
    2017-09-09
  • Java Lettuce 客户端入门到生产的实现步骤

    Java Lettuce 客户端入门到生产的实现步骤

    本文主要介绍了Java Lettuce 客户端入门到生产的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • Java中IOException异常解决方法

    Java中IOException异常解决方法

    这篇文章主要给大家介绍了关于Java中IOException异常解决的相关资料,IOException是Java中的一个受检查异常(Checked Exception),它是java.io包中定义的异常类之一,需要的朋友可以参考下
    2023-07-07
  • Mybatis下划线驼峰处理的几种方法

    Mybatis下划线驼峰处理的几种方法

    这篇文章主要讲述Mybatis下划线驼峰处理的几种方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • 关于HashMap源码解读

    关于HashMap源码解读

    HashMap是基于哈希表的Map接口实现,主要用于存储键值对,它通过数组、链表和红黑树来实现,解决了哈希冲突问题,Java 8中,HashMap对数据结构进行了优化,引入红黑树来提高查找效率,此外,HashMap是非线程安全的,适用于单线程环境
    2024-09-09

最新评论