一、前言

  分析完了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(八)相关推荐

  1. 【集合框架】JDK1.8源码分析之HashMap(一)

    转载自  [集合框架]JDK1.8源码分析之HashMap(一) 一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大 ...

  2. 【JUC】JDK1.8源码分析之ArrayBlockingQueue(三)

    一.前言 在完成Map下的并发集合后,现在来分析ArrayBlockingQueue,ArrayBlockingQueue可以用作一个阻塞型队列,支持多任务并发操作,有了之前看源码的积累,再看Arra ...

  3. 图片加载框架Picasso - 源码分析

    简书:图片加载框架Picasso - 源码分析 前一篇文章讲了Picasso的详细用法,Picasso 是一个强大的图片加载缓存框架,一个非常优秀的开源库,学习一个优秀的开源库,,我们不仅仅是学习它的 ...

  4. JDK1.8源码分析:可重入锁ReentrantLock和Condition的实现原理

    synchronized的用法和实现原理 synchronized实现线程同步的用法和实现原理 不足 synchronized在线程同步的使用方面,优点是使用简单,可以自动加锁和解锁,但是也存在一些不 ...

  5. 手机自动化测试:appium源码分析之bootstrap八

    手机自动化测试:appium源码分析之bootstrap八 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大 ...

  6. 【集合框架】JDK1.8源码分析之IdentityHashMap(四)

    一.前言 前面已经分析了HashMap与LinkedHashMap,现在我们来分析不太常用的IdentityHashMap,从它的名字上也可以看出来用于表示唯一的HashMap,仔细分析了其源码,发现 ...

  7. 集合之ArrayList(含JDK1.8源码分析)

    一.ArrayList的数据结构 ArrayList底层的数据结构就是数组,数组元素类型为Object类型,即可以存放所有类型数据.我们对ArrayList类的实例的所有的操作(增删改查等),其底层都 ...

  8. 【JUC】JDK1.8源码分析之ConcurrentHashMap

    一.前言 最近几天忙着做点别的东西,今天终于有时间分析源码了,看源码感觉很爽,并且发现ConcurrentHashMap在JDK1.8版本与之前的版本在并发控制上存在很大的差别,很有必要进行认真的分析 ...

  9. synchronousqueue场景_【JUC】JDK1.8源码分析之SynchronousQueue(九)

    一.前言 本篇是在分析Executors源码时,发现JUC集合框架中的一个重要类没有分析,SynchronousQueue,该类在线程池中的作用是非常明显的,所以很有必要单独拿出来分析一番,这对于之后 ...

最新文章

  1. 026_PPT知识汇总
  2. Microsoft Web 平台安装程序 (Web PI) Microsoft Web Platform Installer
  3. HTML的标签描述15
  4. Linux基础命令---more
  5. 银行应用_讲解人脸识别在银行的应用
  6. JAVA基础加强笔记
  7. cocos2d学习路线
  8. 空间谱专题16:信号个数估计
  9. C++设计模式-单例模式理论与实例
  10. Http头部和状态码
  11. python格式化字符串怎么_Python格式化字符串
  12. 7个Python实战项目代码,让你感受下大神是如何起飞的!
  13. sparc架构代码分析-setup_arch函数分析
  14. 《人人都是项目经理》-云倩读书笔记
  15. Codeforces Round #829 (Div. 2) C1. Make Nonzero Sum (easy version) 解题报告
  16. 怎么使用计算机英语段落,怎么在电脑word文档中添加英文朗读功能
  17. mysql执行计划explain介绍_MySQL中的执行计划explain详解
  18. 未转变者服务器配置要求,游戏配置 - 未转变者中文维基 | Unturned资料站 - 灰机wiki...
  19. ccna综合实验实训总结_CCNA实训总结
  20. UCloud成首个通过乌云认证的云计算平台

热门文章

  1. 消灭编译警告(Warning)
  2. USB Camera摄像头(UVC 与 gspca)
  3. React开发(258):react项目理解 ant design debug
  4. [react] 在使用react过程中什么时候用HOC?
  5. [软技能] 你认为计算专业和非计算机专业的差别在哪?为什么?
  6. 前端学习(2714):重读vue电商网站34之侧边栏路由改造
  7. “约见”面试官系列之常见面试题之第七十八篇之fetch(建议收藏)
  8. 前端学习(1971)vue之电商管理系统电商系统之完成参数的添加操作
  9. 前端学习(1694):前端系列javascript之变量计算
  10. 前端学习(1641):前端系列实战课程之js的组成部分