Java集合之Set

主要讲Set集合的三个子类:

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

首先,我们来看一下HashSet的继承结构图:
在这里插入图片描述
按照惯例,我们来看看HashSet顶部注释:
在这里插入图片描述
从顶部注释来看,我们就可以归纳HashSet的要点了:

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

顶部注释说底层实际上是一个HashMap实例,那证据呢?
在这里插入图片描述
我们再来看一下HashSet整个类的方法和属性:
在这里插入图片描述
我们知道Map是一个映射,有key有value,既然HashSet底层用的是HashMap,那么value在哪里呢???
在这里插入图片描述
value是一个Object,所有的value都是它
所以可以直接总结出:HashSet实际上就是封装了HashMap,操作HashSet元素实际上就是操作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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值