【集合框架】JDK1.8源码分析HashSet LinkedHashSet(八)
一、前言
分析完了List的两个主要类之后,我们来分析Set接口下的类,HashSet和LinkedHashSet,其实,在分析完HashMap与LinkedHashMap之后,再来分析HashSet与LinkedHashSet,就会变成异常简单,下面开始进行分析。
二、数据结构
2.1 HashSet数据结构
老规矩,先上数据结构,因为HashSet底层是基于HashMap 或者 LinkedHashMap实现的,所以HashSet数据结构就是HashMap或者LinkedHashMap的数据结构,因为前面已经分析过了,所以不再累赘。直接看这里,JDK1.8源码分析之HashMap(一) && JDK1.8源码分析之LinkedHashMap(二)。
2.2 LinkedHashSet数据结构
LinkedHashSet基于LinkedHashMap实现,所以数据结构直接看这里。JDK1.8源码分析之LinkedHashMap(二)。
三、源码分析
3.1 HashSet
1. 类的继承关系
public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable
2. 类的属性
public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable {// 版本序列号static final long serialVersionUID = -5024744406713321676L;// 键值Mapprivate transient HashMap<E,Object> map;// 用作所有键对应的值,键所对应的值都相等private static final Object PRESENT = new Object(); }
View Code
说明:HashSet中由于只包含键,不包含值,由于在底层具体实现时,使用的HashMap或者是LinkedHashMap(可以指定构造函数来确定使用哪种结构),我们知道HashMap是键值对存储,所以为了适应HashMap存储,HashSet增加了一个PRESENT类域(类所有),所有的键都有同一个值(PRESENT)。
3. 其他分析
add、contains、remove函数都是基于HashMap或者LinkedHashMap做的操作,之前已经给出源码分析,不再累赘。
3.2 LinkedHashSet
1. 类的继承关系
public class LinkedHashSet<E>extends HashSet<E>implements Set<E>, Cloneable, java.io.Serializable
说明LinkedHashSet继承自HashSet,也实现了一些接口,不再累赘。
2. 其他说明
LinkedHashSet会调用HashSet的父类构造函数,让其底层实现为LinkedHashMap,这样就很好的实现了LinkedHashSet所需要的功能。
四、总结
HashSet、LinkedHashSet与HashMap、LinkedHashMap相对应。分析了HashMap、LinkedHashMap的源码之后,HashSet、LinkedHashSet也就很浅显易懂了。谢谢各位园友观看~
转载于:https://www.cnblogs.com/leesf456/p/5309809.html
【集合框架】JDK1.8源码分析HashSet LinkedHashSet(八)相关推荐
- 【集合框架】JDK1.8源码分析之HashMap(一)
转载自 [集合框架]JDK1.8源码分析之HashMap(一) 一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大 ...
- 【JUC】JDK1.8源码分析之ArrayBlockingQueue(三)
一.前言 在完成Map下的并发集合后,现在来分析ArrayBlockingQueue,ArrayBlockingQueue可以用作一个阻塞型队列,支持多任务并发操作,有了之前看源码的积累,再看Arra ...
- 图片加载框架Picasso - 源码分析
简书:图片加载框架Picasso - 源码分析 前一篇文章讲了Picasso的详细用法,Picasso 是一个强大的图片加载缓存框架,一个非常优秀的开源库,学习一个优秀的开源库,,我们不仅仅是学习它的 ...
- JDK1.8源码分析:可重入锁ReentrantLock和Condition的实现原理
synchronized的用法和实现原理 synchronized实现线程同步的用法和实现原理 不足 synchronized在线程同步的使用方面,优点是使用简单,可以自动加锁和解锁,但是也存在一些不 ...
- 手机自动化测试:appium源码分析之bootstrap八
手机自动化测试:appium源码分析之bootstrap八 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大 ...
- 【集合框架】JDK1.8源码分析之IdentityHashMap(四)
一.前言 前面已经分析了HashMap与LinkedHashMap,现在我们来分析不太常用的IdentityHashMap,从它的名字上也可以看出来用于表示唯一的HashMap,仔细分析了其源码,发现 ...
- 集合之ArrayList(含JDK1.8源码分析)
一.ArrayList的数据结构 ArrayList底层的数据结构就是数组,数组元素类型为Object类型,即可以存放所有类型数据.我们对ArrayList类的实例的所有的操作(增删改查等),其底层都 ...
- 【JUC】JDK1.8源码分析之ConcurrentHashMap
一.前言 最近几天忙着做点别的东西,今天终于有时间分析源码了,看源码感觉很爽,并且发现ConcurrentHashMap在JDK1.8版本与之前的版本在并发控制上存在很大的差别,很有必要进行认真的分析 ...
- synchronousqueue场景_【JUC】JDK1.8源码分析之SynchronousQueue(九)
一.前言 本篇是在分析Executors源码时,发现JUC集合框架中的一个重要类没有分析,SynchronousQueue,该类在线程池中的作用是非常明显的,所以很有必要单独拿出来分析一番,这对于之后 ...
最新文章
- 026_PPT知识汇总
- Microsoft Web 平台安装程序 (Web PI) Microsoft Web Platform Installer
- HTML的标签描述15
- Linux基础命令---more
- 银行应用_讲解人脸识别在银行的应用
- JAVA基础加强笔记
- cocos2d学习路线
- 空间谱专题16:信号个数估计
- C++设计模式-单例模式理论与实例
- Http头部和状态码
- python格式化字符串怎么_Python格式化字符串
- 7个Python实战项目代码,让你感受下大神是如何起飞的!
- sparc架构代码分析-setup_arch函数分析
- 《人人都是项目经理》-云倩读书笔记
- Codeforces Round #829 (Div. 2) C1. Make Nonzero Sum (easy version) 解题报告
- 怎么使用计算机英语段落,怎么在电脑word文档中添加英文朗读功能
- mysql执行计划explain介绍_MySQL中的执行计划explain详解
- 未转变者服务器配置要求,游戏配置 - 未转变者中文维基 | Unturned资料站 - 灰机wiki...
- ccna综合实验实训总结_CCNA实训总结
- UCloud成首个通过乌云认证的云计算平台
热门文章
- 消灭编译警告(Warning)
- USB Camera摄像头(UVC 与 gspca)
- React开发(258):react项目理解 ant design debug
- [react] 在使用react过程中什么时候用HOC?
- [软技能] 你认为计算专业和非计算机专业的差别在哪?为什么?
- 前端学习(2714):重读vue电商网站34之侧边栏路由改造
- “约见”面试官系列之常见面试题之第七十八篇之fetch(建议收藏)
- 前端学习(1971)vue之电商管理系统电商系统之完成参数的添加操作
- 前端学习(1694):前端系列javascript之变量计算
- 前端学习(1641):前端系列实战课程之js的组成部分