现在这篇主要讲Set集合的三个子类:

  • HashSet集合

    • A:底层数据结构是哈希表(是一个元素为链表的数组) + 红黑树
  • TreeSet集合

    • A:底层数据结构是红黑树(是一个自平衡的二叉树)
    • B:保证元素的排序方式
  • LinkedHashSet集合

    • A::底层数据结构由哈希表(是一个元素为链表的数组)和双向链表组成。
    •  

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

      • 实现Set接口
      • 不保证迭代顺序
      • 允许元素为null
      • 底层实际上是一个HashMap实例
      • 非同步
      • 初始容量非常影响迭代性能
      • 顶部注释说底层实际上是一个HashMap实例
      • 既然HashSet底层用的是HashMap,那么value在哪里呢???

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

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

      • 二、TreeSet剖析

      •  

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

        • 实现NavigableSet接口
        • 可以实现排序功能
        • 底层实际上是一个TreeMap实例
        • 非同步
        • 三、LinkedHashSet剖析

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

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

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

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

            HashSet:

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

            TreeSet:

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

            LinkedHashSet:

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

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

posted on 2018-07-19 11:22  千重峰  阅读(140)  评论(0编辑  收藏  举报