3分钟搞掂Set集合
前言
声明,本文用的是jdk1.8
前面章节回顾:
- Collection总览
- List集合就这么简单【源码剖析】
- Map集合、散列表、红黑树介绍
- HashMap就是这么简单【源码剖析】
- LinkedHashMap就这么简单【源码剖析】
- TreeMap就这么简单【源码剖析】
- ConcurrentHashMap基于JDK1.8源码剖析
现在这篇主要讲Set集合的三个子类:
- HashSet集合
- A:底层数据结构是哈希表(是一个元素为链表的数组) + 红黑树
- TreeSet集合
- A:底层数据结构是红黑树(是一个自平衡的二叉树)
- B:保证元素的排序方式
- LinkedHashSet集合
- A::底层数据结构由哈希表(是一个元素为链表的数组)和双向链表组成。
这篇主要来看看它们比较重要的方法是如何实现的,需要注意些什么,最后比较一下哪个时候用哪个~
强调:在学习本文之前,最好是看过Map系列的文章
看这篇文章之前最好是有点数据结构的基础:
当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~
一、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+双向链表,非线程同步
从结论而言我们就可以根据自己的实际情况来使用了。
参考资料:
如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y。为了大家方便,刚新建了一下qq群:742919422,大家也可以去交流交流。谢谢支持了!希望能多介绍给其他有需要的朋友
文章的目录导航:https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang
目前初步打算写多线程,你们觉得怎么样呢?可以在评论区留言~
3分钟搞掂Set集合的更多相关文章
- ASP.NET 常用状态(信息)保存方式
服务器端:Session(会话)/ Application/ Caching(缓存)/DataBase(数据库) Session: Session: 常用于保存登录用户ID.验证码 不同的浏览器不能共 ...
- Spring与Quartz的整合实现定时任务调度 以及crontab的用法
最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考. 我使用的是Maven来管理项目,需要的Jar包我给大家贴 ...
- [Asp.Net]状态管理(Session、Application、Cache)
上篇博文介绍了在客户端状态管理的两种方式:http://www.cnblogs.com/wolf-sun/p/3329773.html.除了在客户端上保存状态外,还可以在服务器上保存状态.使用客户端的 ...
- Spring3.0.6定时任务
项目使用的Spring版本比较旧是3.0.6版本,由于需要进行定时任务,就决定使用Spring自带的scheduled task. 在网上找了很多文章,也查看了Spring3.0.6的官方文档,按照网 ...
- (2)Spring集成Quartz定时任务框架介绍和Cron表达式详解
在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但 ...
- Spring集成Quartz定时任务框架介绍和Cron表达式详解
原文地址:http://www.cnblogs.com/obullxl/archive/2011/07/10/spring-quartz-cron-integration.html 在JavaEE系统 ...
- statspack系列4
原文:http://jonathanlewis.wordpress.com/2006/12/27/analysing-statspack-4/ 作者:Jonathan Lewis 使用statspac ...
- 使用Python操作Redis
1. 安装pyredis 首先安装pip 1 2 3 4 5 6 7 8 <SHELL># apt-get install python-pip ...... <SHELL> ...
- Session、Application、Cache
[Asp.Net]状态管理(Session.Application.Cache) 上篇博文介绍了在客户端状态管理的两种方式:http://www.cnblogs.com/wolf-sun/p/3329 ...
随机推荐
- poj-1045(数学不好怪我咯)
Description Consider the AC circuit below. We will assume that the circuit is in steady-state. ...
- 【HTML】 HTML基础知识 表单
html 表单 表单的标签是<form>,用于给网站的后台提交数据.提交的数据格式原本是什么样不太清楚,以python的flask框架来看,我从表单中得到的数据是一个字典(flask.re ...
- Java注解(3)-注解处理器(编译期|RetentionPolicy.SOURCE)
注解的处理除了可以在运行时通过反射机制处理外,还可以在编译期进行处理.在编译期处理注解时,会处理到不再产生新的源文件为止,之后再对所有源文件进行编译. Java5中提供了apt工具来进行编译期的注解处 ...
- 生产者/消费者问题的多种Java实现方式
实质上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式,而这是恰恰是在本科操作系统课堂上老师反复讲解,而我们却视而不见不以为然的.在博文<一种面向作业流(工作流)的轻量级可复用 ...
- B-day7
1.昨天的困难,今天解决的进度,以及明天要做的事情 昨天的困难:美化了登录页面,对导入导出的bug进行相关修改,对用户编辑页面进行相关美化,对第三方逻辑进行相应调整. 今天解决的进度:解决了导入和导出 ...
- 团队作业4——第一次项目冲刺(Alpha版本)2017.11.19
第三次会议:2017-11-16 第二次会议讨论的还没有完全实现,于是在第三次会议上对此进行了一些对我们工作上的看法,得出结论:多花时间啊!!!! 又没照照片图: 会议主要内容: 1.登录注册完善 2 ...
- Lucene 的索引文件锁原理
Lucene 的索引文件锁原理 2016/11/24 · IT技术 · lucene 环境 Lucene 6.0.0Java “1.8.0_111”OS Windows 7 Ultimate 线程 ...
- 关于GPUImage的导入
对于GPUImage的使用方面,GitHub上已经非常详细了,就不一一赘述了,但是对于项目的导入来说,最好的方式是 1.下载GPUImage并解压 2.打开压缩包后如图 3.打开终端,cd到此目录 4 ...
- Hibernate之ORM与Hibernate
ORM: ORM是 Object /Relation Mapping,对象/关系数据库映射. 目前比较流行的编程语言,如java ,c#等,它们都是面向对象的编程语言,而目前比较主流的数据库产品,如O ...
- python 一篇搞定所有的异常处理
一:什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在python无法正常处理程序时就会发生一个异常(异常是python对象,表示一个错误) 异常就是 ...