3分钟搞掂Set集合

标签: Java
13人阅读 评论(0) 收藏 举报
分类:

前言

声明,本文用的是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

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

查看评论

python 集合

集合是是无序的,不重复的;而且放入集合的项目必须的项目必须是不可变的。   集合的分类: 1. set 是可变的集合   2.fronzenset是不可变的集合   >>> f = se...
  • zj19880814
  • zj19880814
  • 2013-10-12 14:16:29
  • 631

python3入门之集合set

之前介绍python的数据结构时,没有介绍set(集合)现在在这里稍微介绍下:
  • peace1213
  • peace1213
  • 2015-09-08 14:32:19
  • 1323

集合的三种遍历方式

package cn.itcast.list;import java.util.ArrayList; import java.util.HashMap; import java.util.HashSe...
  • zxiang248
  • zxiang248
  • 2016-04-27 20:14:18
  • 460

使用set集合遍历保存对象

public static void main(String[] args) {         // 具体实现步骤         // 1、创建多个各类新闻标题对象         NewT...
  • JesseCary
  • JesseCary
  • 2016-12-24 14:52:43
  • 1081

Office Password Recovery

  • 2007年12月05日 19:28
  • 980KB
  • 下载

积极心态的力量

  第二名被我追得多惨  积极心态的力量   有一个小男孩,一次长跑比赛回到家里,父亲看他很高兴,就问:你是不是得了第一名?他说:没有呀,我得了第二名。父亲很奇怪:得了第二名,为什么还这么高兴。你知道...
  • kong1122
  • kong1122
  • 2007-04-07 23:42:00
  • 610

ES6 Set集合用法

场景:近期在开发一个桌面的收银系统,开发过程中遇到这个一个问题,在用户购买完产品之后选择使用购物卡进行支付的时候,由于购物卡分很多种类,包括通用,酒水卡,日用品卡(类似优惠券的使用范围限制的问题),如...
  • xjl271314
  • xjl271314
  • 2017-12-16 22:30:36
  • 195

Collection集合的总结以及如果选择适合的集合(包括对List和Set的对比)

Collection |--List 有序,可重复 |--ArrayList 底层数据结构是数组,查询快,增删慢。 线程不安全,效率高 |--Vector 底层...
  • u012312373
  • u012312373
  • 2015-08-05 16:50:58
  • 1063

Swift3-集合类型

一、引言Swift中提供了3种集合类型,Array数据类型,Set集合类型,Dictionary字典类型。 Array用于存放一组有序的数据,数据角标从0开始一次递增; Set用于存放一组...
  • shenhaifeiniao
  • shenhaifeiniao
  • 2017-03-03 16:13:13
  • 577

Set 集合以及Set集合的一些常用方法

set 数组 1、set数组是一个不包含重复元素,无序的元素的集合。 2、set 数组的实现类是HashSet和LinkedHashSet,set接口继承于Collection接口,而Collecti...
  • Strangerpedestrain
  • Strangerpedestrain
  • 2017-08-12 09:55:07
  • 2844
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 8999
    积分: 1665
    排名: 3万+
    公众号