摘要:下面总结一下集合常用的三个子类吧无序,允许为,底层是散列表红黑树,非线程同步有序,不允许为,底层是红黑树非线程同步迭代有序,允许为,底层是双向链表,非线程同步从结论而言我们就可以根据自己的实际情况来使用了。
前言
声明,本文用的是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
目前初步打算写多线程,你们觉得怎么样呢?可以在评论区留言~
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/69071.html
摘要:此项禁止的一个特殊情况是不允许某个包含其自身作为元素。即使的顺序与不一致,其行为也是定义良好的它只是违背了接口的常规协定。 原问题 Java 中怎样实现一种即使元素改变依然有序的集合? 问题由来 起因是在公司做游戏项目的时候遇到一个需求需要实现: 服务器要维护一个帮派成员(Member)的集合,这个集合要按照在线状态、成员等级和名称依次有序排列。 由于每时每刻都有玩家在不断上下线,成员...
摘要:它通常被称为数据结构服务器,因为值可以是字符串哈希列表集合和有序集合等类型。表示内核允许分配所有的物理内存,而不管当前的内存状态如何。管理方便,后续可自行增加或摘除节点,移动分槽等等。 本文已获得原作者霸都民工哥授权。 1、Redis 简介 REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo写的 key-value 存储...
阅读 3615·2021-11-24 09:39
阅读 2546·2021-11-15 11:37
阅读 2210·2021-11-11 16:55
阅读 5154·2021-10-14 09:43
阅读 3702·2021-10-08 10:05
阅读 3005·2021-09-13 10:26
阅读 2326·2021-09-08 09:35
阅读 3534·2019-08-30 15:55