资讯专栏INFORMATION COLUMN

HashSet源码分析:JDK源码系列

用户83 / 885人阅读

摘要:简介继续分析源码,上一篇文章把的分析完毕。本文开始分析简单的介绍一下。存储的元素是无序的并且允许使用空的元素。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75517.html

相关文章

  • JDK源码(容器篇)

    摘要:三系列用于保存键值对,无论是,还是已弃用的或者线程安全的等,都是基于红黑树。是完全基于红黑树的,并在此基础上实现了接口。可以看到,只有红黑树,且红黑树是通过内部类来实现的。 JDK容器 前言 阅读JDK源码有段时间了,准备以博客的形式记录下来,也方便复习时查阅,本文参考JDK1.8源码。 一、Collection Collection是所有容器的基类,定义了一些基础方法。List、Se...

    Soarkey 评论0 收藏0
  • 3分钟搞掂Set集合

    摘要:下面总结一下集合常用的三个子类吧无序,允许为,底层是散列表红黑树,非线程同步有序,不允许为,底层是红黑树非线程同步迭代有序,允许为,底层是双向链表,非线程同步从结论而言我们就可以根据自己的实际情况来使用了。 前言 声明,本文用的是jdk1.8 前面章节回顾: Collection总览 List集合就这么简单【源码剖析】 Map集合、散列表、红黑树介绍 HashMap就是这么简单【源码...

    widuu 评论0 收藏0
  • 深入分析——HashSet是否真的无序?(JDK8)

    摘要:但是,如果像上例中只取最后几位的时候,这可不是什么好事,即使我的数据分布很散乱,但是哈希冲突仍然会很严重。由于我们所创建的是类型的,这也是最巧的一点,类型的返回值就是其值本身,而存储的时候元素通过一些运算后会得出自己在数组中所处的位置。 HashSet 是否无序 (一) 问题起因: 《Core Java Volume I—Fundamentals》中对HashSet的描述是这样的: H...

    everfight 评论0 收藏0
  • 这几道Java集合框架面试题在面试中几乎必问

    摘要:若遇到哈希冲突,则将冲突的值加到链表中即可。之后相比于之前的版本,之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值默认为时,将链表转化为红黑树,以减少搜索时间。有序,唯一红黑树自平衡的排序二叉树。 本文是最最最常见Java面试题总结系列第三周的文章。主要内容: Arraylist 与 LinkedList 异同 ArrayList 与 Vector 区别 HashMap的底层...

    bigdevil_s 评论0 收藏0
  • 前百度面试官整理的——Java后端面试题(一)

    摘要:发生了线程不安全情况。本来在中,发生哈希冲突是可以用链表法或者红黑树来解决的,但是在多线程中,可能就直接给覆盖了。中,当同一个值上元素的链表节点数不小于时,将不再以单链表的形式存储了,会被调整成一颗红黑树。 showImg(https://segmentfault.com/img/bVbsVLk?w=288&h=226); List 和 Set 的区别 List , Set 都是继承自...

    JessYanCoding 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<