3分钟搞掂Set集合

小说:市场上的沿阶草都带土吗?作者:纯安顺更新时间:2019-04-27字数:31376

“王小民,你该知足了。你是我杀过的人里面,得到的待遇最好的。”女郎说到这,而后挥动匕首,站到了王小民身后去。

这里木槿年产量全国第一

宁风致走上前,拍拍他的肩膀,道:“这次海神岛之行帮我好好照顾荣荣和奥斯卡。就是对我最大的感谢了。等你们回来。也就将真正成为我们与武魂殿对抗的中流砥柱。但是,你们一定要记住,生命比实力更重要。如是不可为,宁可放弃目的,也要活着回来。”
“师傅,二师兄也只是自保而己,有必要下手那么狠吗?难道文丑丑的话都是真的吗?”

崔涣便正式决定,准许崔平今年参加族祭,而且还要提高他的家族的地位。

前言

声明,本文用的是jdk1.8

前面章节回顾:

  • Collection总览
  • List集合就这么简单【源码剖析】
  • Map集合、散列表、红黑树介绍
  • HashMap就是这么简单【源码剖析】
  • LinkedHashMap就这么简单【源码剖析】
  • TreeMap就这么简单【源码剖析】
  • ConcurrentHashMap基于JDK1.8源码剖析

现在这篇主要讲Set集合的三个子类:

  • HashSet集合
    • A:底层数据结构是哈希表(是一个元素为链表的数组) + 红黑树
  • TreeSet集合
    • A:底层数据结构是红黑树(是一个自平衡的二叉树)
    • B:保证元素的排序方式
  • LinkedHashSet集合
    • A::底层数据结构由哈希表(是一个元素为链表的数组)和双向链表组成。

这篇主要来看看它们比较重要的方法是如何实现的,需要注意些什么,最后比较一下哪个时候用哪个~

强调:在学习本文之前,最好是看过Map系列的文章

看这篇文章之前最好是有点数据结构的基础:

  • Java实现单向链表
  • 栈和队列就是这么简单
  • 二叉树就这么简单

当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~

一、HashSet剖析

首先,我们来看一下HashSet的继承结构图:

按照惯例,我们来看看HashSet顶部注释:

从顶部注释来看,我们就可以归纳HashSet的要点了:

  • 实现Set接口
  • 不保证迭代顺序
  • 允许元素为null
  • 底层实际上是一个HashMap实例
  • 非同步
  • 初始容量非常影响迭代性能

我本来也是想在写完List集合就转到Set集合的了,可是:看到底层实际上是一个HashMap实例时,我就去学习Map集合先了~

顶部注释说底层实际上是一个HashMap实例,那证据呢?

我们再来看一下HashSet整个类的方法和属性:

对于学习过HashMap的人来说,简直简单得让人开心,哈哈哈~

我们知道Map是一个映射,有key有value,既然HashSet底层用的是HashMap,那么value在哪里呢???

value是一个Object,所有的value都是它

所以可以直接总结出:HashSet实际上就是封装了HashMap,操作HashSet元素实际上就是操作HashMap。这也是面向对象的一种体现,重用性贼高

建议:先去阅读HashMap就是这么简单【源码剖析】

二、TreeSet剖析

首先,我们也来看看TreeSet的类继承结构图:

按照惯例,我们来看看TreeSet顶部注释:

从顶部注释来看,我们就可以归纳TreeSet的要点了:

  • 实现NavigableSet接口
  • 可以实现排序功能
  • 底层实际上是一个TreeMap实例
  • 非同步

三、LinkedHashSet剖析

首先,我们也来看看TreeSet的类继承结构图:

按照惯例,我们来看看LinkedHashSet顶部注释:

从顶部注释来看,我们就可以归纳LinkedHashSet的要点了:

  • 迭代是有序的
  • 允许为null
  • 底层实际上是一个HashMap+双向链表实例(其实就是LinkedHashMap)...
  • 非同步
  • 性能比HashSet差一丢丢,因为要维护一个双向链表
  • 初始容量与迭代无关,LinkedHashSet迭代的是双向链表

四、总结

可以很明显地看到,Set集合的底层就是Map,所以我都没有做太多的分析在上面,也没什么好分析的了。

下面总结一下Set集合常用的三个子类吧:

HashSet:

  • 无序,允许为null,底层是HashMap(散列表+红黑树),非线程同步

TreeSet:

  • 有序,不允许为null,底层是TreeMap(红黑树),非线程同步

LinkedHashSet:

  • 迭代有序,允许为null,底层是HashMap+双向链表,非线程同步

从结论而言我们就可以根据自己的实际情况来使用了。

参考资料:

  • https://zhuanlan.zhihu.com/p/29021276
  • https://blog.csdn.net/panweiwei1994/article/details/76555359

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y。为了大家方便,刚新建了一下qq群:742919422,大家也可以去交流交流。谢谢支持了!希望能多介绍给其他有需要的朋友

文章的目录导航:https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang

目前初步打算写多线程,你们觉得怎么样呢?可以在评论区留言~

编辑:文海

发布:2019-04-27 00:00:00

当前文章:http://leetaemin.cn/array/zc70mzlive.html

红梅盆景苗木哪里有卖? 哪里有卖龙沙宝石月季苗? 凌霄花种子哪里有卖的? 紫藤花架需要搭得密一点吗? 想知道2016年销售最火的榉树是多大的吗? 夏鹃花香吗? 【辨真假】正宗高羊茅草坪种子外观和形状_图片 果岭草夏天怎么培育?

47560 99389 93785 47561 81796 95278 33964 43015 36246 23132 59540 22149 88560 71312 44245 89243 67158 82503 78602 36869

我要说两句: (0人参与)

发布