Set集合就这么简单!

前言

声明,本文用的是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+双向链表,非线程同步

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

参考资料:

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

原文发布于微信公众号 - Java3y(java3y)

原文发表时间:2018-04-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据挖掘DT机器学习

【知识】SAS数据分析完整笔记(3)

SAS学习笔记(3):SAS一般高级语言 本篇SAS读书笔记主要介绍SAS一般高级语言,主要内容包括赋值语句、输出语句、分支机构、循环结构、数组以及函数等六个...

3719
来自专栏计算机视觉与深度学习基础

Leetcode 282. Expression Add Operators

Given a string that contains only digits 0-9 and a target value, return all pos...

1738
来自专栏我是东东强

数据结构之栈与队列(优先队列/堆)

栈与队列是两种重要的特殊线性表,从结构上讲,两者都是线性表,但从操作上讲,两者支持的基本操作却只是线性表操作的子集,是操作受限制的线性表。栈与队列两者最大的区别...

1042
来自专栏书山有路勤为径

旋转数组查找

给定一个排序数组nums(nums中有无重复元素),且nums可能以某个未知下 标旋转,给定目标值target,求target是否在nums中出现,若出现返回所...

762
来自专栏蜉蝣禅修之道

LeetCode之Binary Tree Maximum Path Sum

974
来自专栏数据结构与算法

洛谷 P3386 【模板】二分图匹配 Dinic版

题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每...

3209
来自专栏杨熹的专栏

【LEETCODE】模拟面试-46. Permutations

notice: if ( curList.contains(arr[i]) ){ continue; ...

35512
来自专栏数据结构与算法

P3386 【模板】二分图匹配

题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每...

3277
来自专栏计算机视觉与深度学习基础

Leetcode 282. Expression Add Operators

Given a string that contains only digits 0-9 and a target value, return all pos...

3396
来自专栏Bingo的深度学习杂货店

Q107 Binary Tree Level Order Traversal II

Given a binary tree, return the bottom-up level order traversal of its nodes' va...

2578

扫码关注云+社区