• HashSet源码分析:JDK源码系列


    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的源码已经阅读过的话基本上没有什么问题。(这可能是我写的最轻松的一篇问文章哈哈哈哈哈)

  • 相关阅读:
    python抢票开发——设备预约助手实现
    树莓派的基本网络配置
    python 端口扫描程序
    数据通讯与网络 第五版第24章 传输层协议-TCP协议部分要点
    数据通讯与网络 第五版第24章 传输层协议-UDP协议部分要点
    利用python开发的flappy bird 游戏
    EMACS 快捷键笔记
    python程序中用类变量代替global 定义全局变量
    在树莓派下对多个串口转USB设备进行设备名称绑定操作
    python 编写的经纬度坐标转换类
  • 原文地址:https://www.cnblogs.com/Scramblecode/p/11224051.html
Copyright © 2020-2023  润新知