【集合框架】JDK1.8源码分析HashSet && LinkedHashSet(八)

简介: 分析完了List的两个主要类之后,我们来分析Set接口下的类,HashSet和LinkedHashSet,其实,在分析完HashMap与LinkedHashMap之后,再来分析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;
    // 键值Map
    private transient HashMap<E,Object> map;
    // 用作所有键对应的值,键所对应的值都相等
    private static final Object PRESENT = new Object();
}

说明: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也就很浅显易懂了。谢谢各位园友观看~

目录
相关文章
|
8月前
|
存储 安全 Java
深入理解Java集合框架:ArrayList、LinkedList和HashMap
深入理解Java集合框架:ArrayList、LinkedList和HashMap
288 0
|
算法 Java
java TreeSet 和 TreeMap 源码解读
java 集合篇章——TreeSet 和 TreeMap 源码解读。
120 0
|
存储 Java 索引
【JavaDS】HashMap与HashSet的底层原理
【JavaDS】HashMap与HashSet的底层原理
148 0
【JavaDS】HashMap与HashSet的底层原理
Java集合源码剖析——基于JDK1.8中HashSet、LinkedHashSet的实现原理
Java集合源码剖析——基于JDK1.8中HashSet、LinkedHashSet的实现原理
Java集合源码剖析——基于JDK1.8中HashSet、LinkedHashSet的实现原理
|
存储 安全 Java
Java集合简单了解——基于JDK1.8中LinkedHashMap、TreeMap、Hashtable、Properties的实现原理
Java集合简单了解——基于JDK1.8中LinkedHashMap、TreeMap、Hashtable、Properties的实现原理
Java集合简单了解——基于JDK1.8中LinkedHashMap、TreeMap、Hashtable、Properties的实现原理
|
存储 安全 Java
java集合系列(3)ArrayList(源码分析)
这篇文章开始介绍ArrayList。ArrayList基本上是我们在平时的开发当中,使用最多的一个集合类了,它是一个其容量能够动态增长的动态数组。所以这篇文章,旨在从源码的角度进行分析和理解。为了使得文章更加有条理,还是先给出这篇文章的大致脉络: 首先,ArrayList的基本介绍和源码API(只给出方法分析,重要的方法给出详细代码)。 然后,介绍遍历ArrayList的几种方式 接下来,叙述一下ArrayList与其他集合关键字的区别和优缺点 最后,进行一个总结
248 0
java集合系列(3)ArrayList(源码分析)
|
Java API
【集合框架】JDK1.8源码分析之LinkedHashMap(二)
  前面我们已经分析了HashMap的源码,已经知道了HashMap可以用在哪种场合,如果这样一种情形,我们需要按照元素插入的顺序来访问元素,此时,LinkedHashMap就派上用场了,它保存着元素插入的顺序,并且可以按照我们插入的顺序进行访问。
145 0
【集合框架】JDK1.8源码分析之LinkedHashMap(二)
【集合框架】JDK1.8源码分析之HashMap & LinkedHashMap迭代器(三)
  在遍历HashMap与LinkedHashMap时,我们通常都会使用到迭代器,而HashMap的迭代器与LinkedHashMap迭代器是如何工作的呢?下面我们来一起分析分析。
121 0
【集合框架】JDK1.8源码分析之HashMap & LinkedHashMap迭代器(三)
【集合框架】JDK1.8源码分析之TreeMap(五)
  当我们需要把插入的元素进行排序的时候,就是时候考虑TreeMap了,从名字上来看,TreeMap肯定是和树是脱不了干系的,它是一个排序了的Map,下面我们来着重分析其源码,理解其底层如何实现排序功能。下面,开始分析。
84 0
【集合框架】JDK1.8源码分析之TreeMap(五)
|
Java 索引
【集合框架】JDK1.8源码分析之ArrayList(六)
  分析了Map中主要的类之后,下面我们来分析Collection下面几种常见的类,如ArrayList、LinkedList、HashSet、TreeSet等。下面通过JDK源码来一起分析ArrayList底层是如何实现的。(PS:把JVM看完了之后终于可以有成片的时间来阅读源码了,感觉简直不能更爽)。
133 0
【集合框架】JDK1.8源码分析之ArrayList(六)