深入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的源代码如下:

  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提供的构造方法如下,该方法为包访问权限,并未对外公开。

  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,以很简单明了的方式来实现了其自身的所有功能。

 

3.  相关说明:

   1) 相关HashSet的实现原理,请参考我的上一遍总结:深入Java集合学习系列:HashSet的实现原理。

   2)相关HashMap的实现原理,请参考我的上一遍总结:深入Java集合学习系列:HashMap的实现原理。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MVC自动配置原理---SpringBoot

MVC自动配置原理 官网阅读 在进行项目编写前&#xff0c;我们还需要知道一个东西&#xff0c;就是SpringBoot对我们的SpringMVC还做了哪些配置&#xff0c;包括如何扩展&#xff0c;如何定制。 只有把这些都搞清楚了&#xff0c;我们在之后使用才会更加得心应手。途径一&…

struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Emp实体类和对应的配置信息

easyui是jquery中很强大的插件&#xff0c;我们开发人员经常会遇到比较复杂的布局&#xff0c;或者在实现某个功能的时候要写好多的代码&#xff0c;比如说分页&#xff0c;那么easyui的datagrid就把他给代替了&#xff0c;现在我简要的分享几个案例。 我们先创建一个员工的实体…

idea合并分支 idea git 合并分支

当前在dev上面 将dev_yjb合并到dev上面 idea git 合并分支 awesome_go 2018-07-12 16:22:20 50149 收藏 52 分类专栏&#xff1a; git idea git的使用&#xff08;四&#xff09;git建立分支与合并分支 作者&#xff1a;马育民 • 2017-11-10 17:05 • 阅读&#xff1a;10…

.NET Core New csproj 如何发布可执行文件

一、前言 .NET工具链在最新的Preview3版本中&#xff0c;引入了新的MSBuild项目系统&#xff0c;项目文件又回归了.csproj的XML文件来管理&#xff0c;项目文件、包引用、程序集引用、.NET Core工具集、发布内容定义等内容。本文主要将主要讨论&#xff0c;如何在新的项目系统中…

xshell linux cmd命令大全,Linux(Xshell)命令大全

对Linux的操作经常是使用Xshell工具&#xff0c;这里特地整理了一些Linux比较常用的快捷键和命令&#xff0c;分享给大家&#xff0c;希望对大家有所帮助^ _ ^一、Linux常用快捷键Ctrl Z &#xff1a;退出Ctrl insert &#xff1a;复制Shift insert &#xff1a;粘贴Tab &am…

java.util.Stack类简介

转载自 java.util.Stack类简介 Stack是一个后进先出&#xff08;last in first out&#xff0c;LIFO&#xff09;的堆栈&#xff0c;在Vector类的基础上扩展5个方法而来 Deque&#xff08;双端队列&#xff09;比起Stack具有更好的完整性和一致性&#xff0c;应该被优先使用…

作为 IT 行业的过来人,你有什么话想对后辈说的?2

1 本人本硕机械工程&#xff0c;目前就职于阿里巴巴淘宝无线事业群&#xff0c;摸爬滚打三年还是能给大家提供点建议。 1、至少每周坚持复盘。这是最重要的习惯&#xff0c;可能大家在学校都有这种印象&#xff0c;明明一本书看过/一道题做过&#xff0c;重新复习的时候感觉什…

struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Dept实体类和对应的配置信息

现在请大家看看Dept的实体类和对应的映射信息&#xff1a; Dept实体类 package org.entity;import java.util.HashSet; import java.util.Set;/*** Dept entity. author MyEclipse Persistence Tools*/public class Dept implements java.io.Serializable {// Fieldsprivate I…

.NET Core 首例 Office 开源跨平台组件(NPOI Core)

前言 最近项目中&#xff0c;需要使用到 Excel 导出&#xff0c;找了一圈发现没有适用于 .NET Core的&#xff0c;不依赖Office和操作系统限制的 Office 组件&#xff0c;于是萌生了把 NPOI 适配并移植到 .NET Core 的想法。 NPOI 的介绍不多说了&#xff0c;不了解的可以看一下…

员工管理系统---SpringBoot

目录结构 全部代码 package com.kuang.config;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;//拦截器 public class LoginHandlerInterceptor implements Hand…

深入Java集合系列之五:PriorityQueue

转载自 深入Java集合系列之五&#xff1a;PriorityQueue 前言 今天继续来分析一下PriorityQueue的源码实现&#xff0c;实际上在Java集合框架中&#xff0c;还有ArrayDeque&#xff08;一种双端队列&#xff09;&#xff0c;这里就来分析一下PriorityQueue的源码。PriorityQu…

linux系统操作大全,Linux系统的常用操作命令大全

From:http://www.xiaoxiaozi.com/2010/11/09/1985/摘自&#xff1a;http://hi.baidu.com/jackywdx/blog/item/393ccf4b64268bf482025cde.html系统# uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo # 查看CPU信息# hostnam…

抹掉所有内容和设置 连接到icloud时出错 iphone还原出厂设置

设置-》抹掉所有内容和设置 点击设置 在顶部输入框中 输入抹掉 2个子就可以找到 1&#xff0c;点通用&#xff0c;存储用量&#xff0c;如果icloud为不可用&#xff0c; 设置--蜂窝数据-网络为无线网和蜂窝数据&#xff0c;成功的点个赞吧~&#xff01;&#xff08;这个过…

struts+hibernate+oracle+easyui实现lazyout组件的简单案例——hibernate的config文件(hibernate.cfg.xml)

hibernate.cfg.xml文件&#xff0c;必不可少的一个xml文件&#xff0c;上面附有数据库的用户名&#xff0c;密码&#xff0c;链接字符串&#xff0c;方言等信息&#xff0c;还包含映射的文件路径&#xff1a; <?xml version1.0 encodingUTF-8?> <!DOCTYPE hibernate…

微服务的前世今生

译者&#xff1a;周元昊 与许多人认为的不同&#xff0c;微服务的概念已有相当长的历史&#xff0c;SOA&#xff08;面向服务的体系架构&#xff09;也不是90年代才被提出的。在最近举办的伦敦微服务大会上&#xff0c;Greg Young就微服务核心概念的前世今生进行了演讲。其中他…

linux 查看本机网关地址,linux查看服务器网关地址

弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器&#xff0c;帮助用户打造可靠、安全、灵活、高效的应用环境&#xff0c;确保服务持久稳定运行&#xff0c;提升运维效率三年低至5折&#xff0c;多种配置可选了解详情什么是弹性…

非阻塞线程安全列表——ConcurrentLinkedDeque应用举例

转载自 非阻塞线程安全列表——ConcurrentLinkedDeque应用举例 在java中,最常用的数据结构可能是列表。有数目不详的元素列表,你可以添加、阅读、或删除任何位置的元素。此外,并发列表允许不同的线程列表中添加或删除元素时不产生任何数据不一致。非阻塞列表提供如下操作,如果…

整合JDBC---SpringBoot

整合JDBC SpringData简介 对于数据访问层&#xff0c;无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库)&#xff0c;Spring Boot 底层都是采用 Spring Data 的方式进行统一处理。 Spring Boot 底层都是采用 Spring Data 的方式进行统一处理各种数据库&#xff0c;Sprin…

struts+hibernate+oracle+easyui实现lazyout组件的简单案例——EmpDao层代码

严格按照三层架构来写的&#xff0c;Dao层的代码比较少&#xff0c;我直接把Emp和实现类的都放在这篇文章里面吧&#xff0c; IEmpDao.java接口&#xff1a; /** * Title: IEmpDao.java * Package org.dao * Description: TODO该方法的主要作用&#xff1a; * author A18ccm…

在idea 中添加和删除模块Module

在idea 中添加和删除模块Module ThinkPet 2018-12-22 10:12:50 4125 收藏 1 分类专栏&#xff1a; idea 版权 1.添加模块 2.删除模块 ———————————————— 版权声明&#xff1a;本文为CSDN博主「ThinkPet」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&am…