浅谈Java中的LinkedHashSet哈希链表

 更新时间:2023年09月04日 08:44:51   作者:橙子  
这篇文章主要介绍了浅谈Java中的LinkedHashSet哈希链表,LinkedHashSet 是 Java 中的一个集合类,它是 HashSet 的子类,并实现了 Set 接口,与 HashSet 不同的是,LinkedHashSet 保留了元素插入的顺序,并且具有 HashSet 的快速查找特性,需要的朋友可以参考下

HashSet哈希链表

Map、Set集合存放是无序的,然而LinkedHashSet和LinkedHashMap等集合却有序

原因:LinkedHashSet与LinkedHashMap底层是通过双向链表来实现排序的。

双向链表里面的数据在逻辑上的存储是连续的,连续自然也就有顺序。

有序的原因关键在LinkedHashMap的Node 节点上。

LinkedHashMap 继承自HashMap 并且实现了Map接口。

源码如下:

/**
HashMap.Node subclass for normal LinkedHashMap entries.
*/
static class Entry<K,V> extends HashMap.Node<K,V> {
    Entry<K,V> before, after;
    Entry(int hash, K key, V value, Node<K,V> next) {
        super(hash, key, value, next);
    }
}

可以看到LinkedHashMap.Entry 继承自HashMap.Node 除了Node 本身有的几个属性外,额外增加了before after 用于指向前一个Entry 后一个Entry。

也就是说,元素之间维持着一条总的链表数据结构。正式因为这个链表才保证了LinkedHashMap的有序性。

LinkedHashSet集合也是根据元素hashCode值来决定元素存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。

也就是说,当遍历LinkedHashSet集合里元素时,HashSet将会按元素的添加顺序来访问集合里的元素,因此LinkedHashSet可以保证元素按插入顺序输出。

而Set对每个对象只接受一次,里面的值不允许重复,是无序的数据结构;

LinkeHashSet是set集合的一个实现,具有set集合不重复的特点,同时具有可预测的迭代顺序,即输入顺序。

这种双链表的结构一条用于储存元素,一条用于记录顺序。

而Map Set集合内是单链表或稀疏数组,各元素之间并没有维持一条总的链表结构,所以Map和Set是无序的

LinkedHashSet的4种构造函数:

  1. 第一种构造函数初始化一个空的LinkedHashSet: LinkedHashSet( );
  2. 第二种构造函数使用Collection元素集初始化LinkedHashSet: LinkedHashSet(Collection c);
  3. 第三种构造函数用给定的容量初始化LinkedHashSet: LinkedHashSet(int capacity);
  4. 第四种构造函数通过传入的容量和填充比初始化LinkedHashSet: LinkedHashSet(int capacity, float fillRatio);

在这里插入图片描述

运行结果:

在这里插入图片描述

这两断代码我们可以得出:LinkedHashSet 底层采用双向链表实现,可以保证元素的插入顺序,又因为是HashSet的子类,所以插入的元素不能重复。

到此这篇关于浅谈Java中的LinkedHashSet哈希链表的文章就介绍到这了,更多相关Java的LinkedHashSet内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis-Plus最优化持久层开发过程

    Mybatis-Plus最优化持久层开发过程

    Mybatis-plus(简称MP)是一个Mybatis的增强工具,在mybatis的基础上只做增强不做改变,提高效率,自动生成单表的CRUD功能,这篇文章主要介绍了Mybatis-Plus最优化持久层开发,需要的朋友可以参考下
    2024-07-07
  • IDEA将Java.class文件反编译为Java文件原理、实践与深度解析

    IDEA将Java.class文件反编译为Java文件原理、实践与深度解析

    本文详细介绍了如何使用IntelliJ IDEA进行.class到.java的反编译,包括基础概念、实用技巧、引擎配置、疑难问题解决以及生产环境实战案例,通过这些步骤,开发者可以有效地理解和学习Java代码,提升开发效率,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • SpringBoot使用Jackson详解

    SpringBoot使用Jackson详解

    Spring Boot中使用Jackson处理JavaBean序列化为JSON格式,常用框架包括Jackson、Fastjson和Gson,Jackson是Spring Boot默认的JSON处理库,常用注解如@JsonProperty、@JsonIgnore、@JsonFormat等,用于自定义序列化和反序列化行为
    2025-02-02
  • Mybatis plus的自动填充与乐观锁的实例详解(springboot)

    Mybatis plus的自动填充与乐观锁的实例详解(springboot)

    这篇文章主要介绍了Mybatis plus的自动填充与乐观锁的实例详解(springboot),本文给大家介绍的非常详细对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 深入浅析ZooKeeper的工作原理

    深入浅析ZooKeeper的工作原理

    ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现。接下来通过本文跟大家介绍ZooKeeper的原理,小编觉得挺不错的,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Java对字符串进行加密解密

    Java对字符串进行加密解密

    这篇文章主要为大家详细介绍了Java字符串加密解密,对用户输入的每个字符的值进行加密解密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java实现简单计算器小程序

    Java实现简单计算器小程序

    这篇文章主要为大家详细介绍了Java实现简单计算器小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • java实现点击按钮事件弹出子窗口

    java实现点击按钮事件弹出子窗口

    这篇文章主要为大家详细介绍了java实现点击按钮事件弹出子窗口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Java线程池实现带返回值的方式方法

    Java线程池实现带返回值的方式方法

    在Java中,线程池是一种重要的多线程处理方式,可以有效管理和重用线程,提高程序的性能和效率,有时候我们需要在多线程处理中获取线程的返回值,本文将介绍如何使用线程池实现带返回值的方式方法,需要的朋友可以参考下
    2024-09-09
  • Java使用MessageFormat应注意的问题

    Java使用MessageFormat应注意的问题

    这篇文章主要介绍了Java使用MessageFormat应注意的问题,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-06-06

最新评论