美文网首页
Javase-set集合

Javase-set集合

作者: 流年划破容颜_cc55 | 来源:发表于2018-08-05 17:24 被阅读7次

    参考原文地址
    现在这篇主要讲Set集合的三个子类:

    • HashSet集合
      A:底层数据结构是哈希表(是一个元素为链表的数组) + 红黑树
    • TreeSet集合
      A:底层数据结构是红黑树(是一个自平衡的二叉树)
      B:保证元素的排序方式
    • LinkedHashSet集合
      A::底层数据结构由哈希表(是一个元素为链表的数组)和双向链表组成。
      这篇主要来看看它们比较重要的方法是如何实现的,需要注意些什么,最后比较一下哪个时候用哪个~

    强调:在学习本文之前,最好是看过Map系列的文章

    一、HashSet剖析

    首先,我们来看一下HashSet的继承结构图:

    image.png

    按照惯例,我们来看看HashSet顶部注释:

    image.png

    从顶部注释来看,我们就可以归纳HashSet的要点了:

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

    我本来也是想在写完List集合就转到Set集合的了,可是:看到底层实际上是一个HashMap实例时,我就去学习Map集合先了~

    顶部注释说底层实际上是一个HashMap实例,那证据呢?

    image.png

    我们再来看一下HashSet整个类的方法和属性:

    image.png

    对于学习过HashMap的人来说,简直简单得让人开心,哈哈哈~

    我们知道Map是一个映射,有key有value,既然HashSet底层用的是HashMap,那么value在哪里呢???

    image.png

    value是一个Object,所有的value都是它

    所以可以直接总结出:HashSet实际上就是封装了HashMap,操作HashSet元素实际上就是操作HashMap。这也是面向对象的一种体现,重用性贼高

    建议:先去阅读HashMap就是这么简单【源码剖析】

    二、TreeSet剖析

    首先,我们也来看看TreeSet的类继承结构图:

    image.png

    按照惯例,我们来看看TreeSet顶部注释:

    image.png

    从顶部注释来看,我们就可以归纳TreeSet的要点了:

    • 实现NavigableSet接口
    • 可以实现排序功能
    • 底层实际上是一个TreeMap实例
    • 非同步
    image.png

    三、LinkedHashSet剖析

    首先,我们也来看看TreeSet的类继承结构图:

    image.png

    按照惯例,我们来看看LinkedHashSet顶部注释:

    image.png

    从顶部注释来看,我们就可以归纳LinkedHashSet的要点了:

    • 迭代是有序的
    • 允许为null
    • 底层实际上是一个HashMap+双向链表实例(其实就是LinkedHashMap)...
    • 非同步
    • 性能比HashSet差一丢丢,因为要维护一个双向链表
    • 初始容量与迭代无关,LinkedHashSet迭代的是双向链表

    四、总结

    可以很明显地看到,Set集合的底层就是Map,所以我都没有做太多的分析在上面,也没什么好分析的了。

    下面总结一下Set集合常用的三个子类吧:

    HashSet:

    • 无序,允许为null,底层是HashMap(散列表+红黑树),非线程同步

    TreeSet:

    • 有序,不允许为null,底层是TreeMap(红黑树),非线程同步

    LinkedHashSet:

    • 迭代有序,允许为null,底层是HashMap+双向链表,非线程同步

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

    相关文章

      网友评论

          本文标题:Javase-set集合

          本文链接:https://www.haomeiwen.com/subject/zqgbvftx.html