java源码:LinkedHashSet

2023-10-28 12:32
文章标签 java 源码 linkedhashset

本文主要是介绍java源码:LinkedHashSet,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.    LinkedHashSet概述:

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

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

 

2.    LinkedHashSet的实现:

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

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

Java代码   收藏代码
  1. public class LinkedHashSet<E>  
  2.     extends HashSet<E>  
  3.     implements Set<E>, Cloneable, java.io.Serializable {  
  4.   
  5.     private static final long serialVersionUID = -2851667679971038690L;  
  6.   
  7.     /** 
  8.      * 构造一个带有指定初始容量和加载因子的新空链接哈希set。 
  9.      * 
  10.      * 底层会调用父类的构造方法,构造一个有指定初始容量和加载因子的LinkedHashMap实例。 
  11.      * @param initialCapacity 初始容量。 
  12.      * @param loadFactor 加载因子。 
  13.      */  
  14.     public LinkedHashSet(int initialCapacity, float loadFactor) {  
  15.         super(initialCapacity, loadFactor, true);  
  16.     }  
  17.   
  18.     /** 
  19.      * 构造一个带指定初始容量和默认加载因子0.75的新空链接哈希set。 
  20.      * 
  21.      * 底层会调用父类的构造方法,构造一个带指定初始容量和默认加载因子0.75的LinkedHashMap实例。 
  22.      * @param initialCapacity 初始容量。 
  23.      */  
  24.     public LinkedHashSet(int initialCapacity) {  
  25.         super(initialCapacity, .75f, true);  
  26.     }  
  27.   
  28.     /** 
  29.      * 构造一个带默认初始容量16和加载因子0.75的新空链接哈希set。 
  30.      * 
  31.      * 底层会调用父类的构造方法,构造一个带默认初始容量16和加载因子0.75的LinkedHashMap实例。 
  32.      */  
  33.     public LinkedHashSet() {  
  34.         super(16, .75f, true);  
  35.     }  
  36.   
  37.     /** 
  38.      * 构造一个与指定collection中的元素相同的新链接哈希set。 
  39.      *  
  40.      * 底层会调用父类的构造方法,构造一个足以包含指定collection 
  41.      * 中所有元素的初始容量和加载因子为0.75的LinkedHashMap实例。 
  42.      * @param c 其中的元素将存放在此set中的collection。 
  43.      */  
  44.     public LinkedHashSet(Collection<? extends E> c) {  
  45.         super(Math.max(2*c.size(), 11), .75f, true);  
  46.         addAll(c);  
  47.     }  
  48. }  

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

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

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

这篇关于java源码:LinkedHashSet的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/293233

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La