Java中LinkedHashSet的实现原理详解

 更新时间:2023年09月04日 08:32:20   作者:魔笛Love  
这篇文章主要介绍了Java中LinkedHasSet的实现原理详解,LinkedHashSet 是具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现,此实现与HashSet 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表,需要的朋友可以参考下

LinkedHasSet实现原理

概述

LinkedHashSet 是具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与HashSet 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。

此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序。

注意,此实现不是同步的。如果多个线程同时访问链接的哈希 Set,而其中至少一个线程修改了该 Set,则它必须保持外部同步。

实现

对于 LinkedHashSet 而言,它继承与 HashSet、又基于 LinkedHashMap 来实现的。

LinkedHashSet 底层使用 LinkedHashMap 来保存所有元素,它继承与 HashSet,其所有的方法操作上又与 HashSet 相同,因此 LinkedHashSet 的实现上非常简单,只提供了四个构造方法,并通过传递一个标识参数,调用父类的构造器,底层构造一个 LinkedHashMap来实现,在相关操作上与父类 HashSet 的操作相同,直接调用父类 HashSet 的方法即可。

LinkedHashSet 的源代码如下:

public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Serializable {
    private static final long serialVersionUID = -2851667679971038690L;
    /**
     * 构造一个带有指定初始容量和加载因子的新空链接哈希 set。
     *
     * 底层会调用父类的构造方法,构造一个有指定初始容量和加载因子的 LinkedHashMap 实例。
     * @param initialCapacity 初始容量。
     * @param loadFactor 加载因子。
     */
    public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }
    /**
     * 构造一个带指定初始容量和默认加载因子 0.75 的新空链接哈希 set。
     *
     * 底层会调用父类的构造方法,构造一个带指定初始容量和默认加载因子 0.75 的 LinkedHashMap 实例。
     * @param initialCapacity 初始容量。
     */
    public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }
    /**
     * 构造一个带默认初始容量 16 和加载因子 0.75 的新空链接哈希 set。
     *
     * 底层会调用父类的构造方法,构造一个带默认初始容量 16 和加载因子 0.75 的 LinkedHashMap 实例。
     */
    public LinkedHashSet() {
        super(16, .75f, true);
    }
    /**
     * 构造一个与指定 collection 中的元素相同的新链接哈希 set。
     *
     * 底层会调用父类的构造方法,构造一个足以包含指定 collection
     * 中所有元素的初始容量和加载因子为 0.75 的 LinkedHashMap 实例。
     * @param c 其中的元素将存放在此 set 中的 collection。
     */
    public LinkedHashSet(Collection<? extends E> c) {
        super(Math.max(2*c.size(), 11), .75f, true);
        addAll(c);
    }
}

在父类 HashSet 中,专为 LinkedHashSet 提供的构造方法如下,该方法为包访问权限,并未对外公开。

/**
     * 以指定的 initialCapacity 和 loadFactor 构造一个新的空链接哈希集合。
     * 此构造函数为包访问权限,不对外公开,实际只是是对 LinkedHashSet 的支持。
     *
     * 实际底层会以指定的参数构造一个空 LinkedHashMap 实例来实现。
     * @param initialCapacity 初始容量。
     * @param loadFactor 加载因子。
     * @param dummy 标记。
     */
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
}

由上述源代码可见,LinkedHashSet 通过继承 HashSet,底层使用 LinkedHashMap,以很简单明了的方式来实现了其自身的所有功能。

到此这篇关于Java中LinkedHashSet的实现原理详解的文章就介绍到这了,更多相关LinkedHasSet实现原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot后端验证码的实现示例

    SpringBoot后端验证码的实现示例

    为了防止网站的用户被通过密码典爆破,引入验证码的功能是十分有必要的,本文主要介绍了SpringBoot后端验证码的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • 关于Intellij IDEA中的Version Control问题

    关于Intellij IDEA中的Version Control问题

    这篇文章主要介绍了Intellij IDEA中的Version Control问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • Spring IOC容器Bean注解创建对象组件扫描

    Spring IOC容器Bean注解创建对象组件扫描

    这篇文章主要为大家介绍了Spring IOC容器Bean注解创建对象组件扫描,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Java开发者结合Node.js编程入门教程

    Java开发者结合Node.js编程入门教程

    这篇文章主要介绍了Java开发者结合Node.js编程入门教程,我将先向您展示如何使用Java EE创建一个简单的Rest服务来读取 MongoDB数据库。然后我会用node.js来实现相同的功能,需要的朋友可以参考下
    2014-09-09
  • 解析MapStruct转换javaBean时出现的诡异事件

    解析MapStruct转换javaBean时出现的诡异事件

    在项目中用到了MapStruct,对其可以转换JavaBean特别好奇,今天小编给大家分享一个demo给大家讲解MapStruct转换javaBean时出现的诡异事件,感兴趣的朋友一起看看吧
    2021-09-09
  • MyBatis与Spring中的SqlSession详解

    MyBatis与Spring中的SqlSession详解

    在MyBatis中,你可以使用SqlSessionFactory来创建SqlSession,使用MyBatis-Spring之后,你不再需要直接使用SqlSessionFactory了,接下来通过示例代码讲解MyBatis与Spring中的SqlSession,需要的朋友可以参考下
    2024-05-05
  • java控制台输出图书馆管理系统

    java控制台输出图书馆管理系统

    这篇文章主要为大家详细介绍了java控制台输出图书馆管理系统,只用java代码不用数据库和GUI等,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • Java容器ArrayList原理解析

    Java容器ArrayList原理解析

    这篇文章主要介绍了Java容器ArrayList原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java线程池的四种拒绝策略详解

    Java线程池的四种拒绝策略详解

    jdk1.5 版本新增了JUC并发编程包,极大的简化了传统的多线程开发,下面这篇文章主要介绍了Java线程池的四种拒绝策略的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Spring Data JPA中 in 条件参数的传递方式

    Spring Data JPA中 in 条件参数的传递方式

    这篇文章主要介绍了Spring Data JPA中 in 条件参数的传递方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论