1.简介

继续分析源码,上一篇文章把HashMap的分析完毕。本文开始分析HashSet简单的介绍一下。

HashSet是一个无重复元素集合,内部使用HashMap实现,所以HashMap的特征耶继承了下来。存储的元素是无序的并且HashSet允许使用空的元素。

HashSet是非同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。(参考JDK1.8文档,关注回复JDK可获取中文版JDK文档)

 Set s = Collections.synchronizedSet(new HashSet(...));

上文链接:

HashMap源码阅读(一)

HashMap源码阅读(二)

1.继承结构

先看一下HashMap的继承结构

和其他集合一样HashSet也实现了Cloneable和Serializable两个接口,同时也是先了Set接口实现了Set的一些接口规范。

  • Cloneable 克隆
  • Serializable序列化

2属性

HashSet的存储数据是由HashMap来实现的,所以HashMap的一些特性也都继承了过来。在阅读源码的时候千万不要直接的去阅读HashSet在阅读之前最好先把HashMap看了。在阅读HashMap的时候最好结合着1.7版本的源码一起看。

private transient HashMap<E,Object> map;

上面说到HashSet是由HashMap来实现的而存储的数据作为HashMap的K,V统一就是PRESENT

   // Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();

3.构造方法

无参构造方法,直接创建一个HashMap采用无参构造方法的默认属性上篇文章说过默认容量是16加载因子是0.75

指定容量

指定容量和加载因子,加载因子在HashMap中用来计算容量默认的就是总容量*加载因子,默认的加载因子是0.75

指定集合元素

4.添加

可以看出HashSet使用put进行添加元素,要添加的元素作为mapd的Key 而value则默认的就是PRESENT。上篇文章介绍过HashMap的put方法如果插入的值的Key不存在则返回null否则就返回已经存在的值,所以这里做了一个判断。是不是很简单。

5.查找

查找元素调用了HashMap的containsKey方法如果存在返回true不存在返回false。

6.删除

删除方法也是调用map的remove方法,看到这里我们看出HashSet全部是依赖于HashMap。

7.迭代方法

也是通过Map来实现使用keySet来返回一个key的Iterator。

8.总结

其实HashSet的一些东西都是用HashMap来实现的,如果HashMap的源码已经阅读过的话基本上没有什么问题。(这可能是我写的最轻松的一篇问文章哈哈哈哈哈)

HashSet源码分析:JDK源码系列的更多相关文章

  1. JVM源码分析-JVM源码编译与调试

    要分析JVM的源码,结合资料直接阅读是一种方式,但是遇到一些想不通的场景,必须要结合调试,查看执行路径以及参数具体的值,才能搞得明白.所以我们先来把JVM的源码进行编译,并能够使用GDB进行调试. 编 ...

  2. [源码分析] 从源码入手看 Flink Watermark 之传播过程

    [源码分析] 从源码入手看 Flink Watermark 之传播过程 0x00 摘要 本文将通过源码分析,带领大家熟悉Flink Watermark 之传播过程,顺便也可以对Flink整体逻辑有一个 ...

  3. k8s client-go源码分析 informer源码分析(2)-初始化与启动分析

    k8s client-go源码分析 informer源码分析(2)-初始化与启动分析 前面一篇文章对k8s informer做了概要分析,本篇文章将对informer的初始化与启动进行分析. info ...

  4. k8s client-go源码分析 informer源码分析(3)-Reflector源码分析

    k8s client-go源码分析 informer源码分析(3)-Reflector源码分析 1.Reflector概述 Reflector从kube-apiserver中list&watc ...

  5. LinkedList 源码分析(JDK 1.8)

    1.概述 LinkedList 是 Java 集合框架中一个重要的实现,其底层采用的双向链表结构.和 ArrayList 一样,LinkedList 也支持空值和重复值.由于 LinkedList 基 ...

  6. JAVA源码分析-HashMap源码分析(二)

    本文继续分析HashMap的源码.本文的重点是resize()方法和HashMap中其他的一些方法,希望各位提出宝贵的意见. 话不多说,咱们上源码. final Node<K,V>[] r ...

  7. 《k8s-1.13版本源码分析》-源码调试

    源码分析系列文章已经开源到github,地址如下: github:https://github.com/farmer-hutao/k8s-source-code-analysis gitbook:ht ...

  8. 精尽MyBatis源码分析 - MyBatis-Spring 源码分析

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  9. 精尽MyBatis源码分析 - Spring-Boot-Starter 源码分析

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

随机推荐

  1. [转]深入Android内存泄露

    深入内存泄露 Android应用的内存泄露,其实就是java虚拟机的堆内存泄漏. 当然,当应用有ndk,jni时,没有及时free,本地堆也会出现内存泄漏. 本文只是针对JVM内存泄漏应用,进行阐述分 ...

  2. 深入理解 Win32 PE 文件格式 Matt Pietrek(慢慢体会)

    这篇文章假定你熟悉C++和Win32. 概述 理解可移植可执行文件格式(PE)可以更好地了解操作系统.如果你知道DLL和EXE中都有些什么东西,那么你就是一个知识渊博的程序员.这一系列文章的第一部分, ...

  3. 转换GMT秒数为日期时间格式-Delphi源码

    转换GMT秒数为日期时间格式-Delphi源码.收藏最近在写PE分析工具的时候,需要转换TimeDateStamp字段值为日期时间格式,这是Delphi的源码. //把GMT时间的秒数转换成日期时间格 ...

  4. Qt paintEvent绘制窗体 注意Qt::WA_PaintOutsidePaintEvent 只是适用于X11,其他系统均无效

    QPainter默认只能在paintEvent里面调用,但是: 在其他事件中绘制窗体,提示信息如下:QPainter::begin: Paint device returned engine == 0 ...

  5. 通过内核对象在服务程序和桌面程序之间通信的小问题 good

    关于在通过 事件对象 在服务程序和普通桌面应用程序相互之间通信的问题,分类情况进行讨论:1.普通桌面应用程序中创建事件,服务程序中打开事件 XP的情况普通桌面应用程序中创建: m_hEvent = : ...

  6. Codility---MaxSliceSum

    Task description A non-empty zero-indexed array A consisting of N integers is given. A pair of integ ...

  7. 浏览器引擎-phantomjs初次认识

    最近没什么重要的任务,就抽空看了看项目组爬虫小组的代码,因为我们的爬虫主要是以python的scrapy框架为主,看起来比较方便.在看代码的时候看到一个叫phantomjs的东西,蛮新鲜的,就去问了下 ...

  8. centos安装最新版MySQL 8.0教程

    这篇教程是通过yum方式安装的 安装依赖 yum install libaio wget -y 检查MYSQL是否已安装 yum list installed | grep mysql 如果有先卸载 ...

  9. 01 Django基础

    目录 一.什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对 ...

  10. thinkphp5ajax分頁&&搜索後分頁

    //控制器層 //分頁 public function list_january_table(){ //設置當前頁 $page = input("post.page") ? inp ...