• (十)集合 -Set


    一、Set 接口(P518)

    1.  Set接口基本介绍

    1)无序(添加和取出的顺序不一致),没有索引 
    2)不允许重复元素,所以最多包含一个 null

    2. Set接口的常用方法

    和 List 接口一样,Set 接口也是 Collection 的子接口,因此,常用方法和 Collection 接口一样。

    3. Set接口的遍历方式

    同 Collection 的遍历方式一样,因为 Set 接口是 Collection 接口的子接口
    (1)可以使用选代器
    (2)增强for
    (3)不能使用索引的方式来获取

    二、Set 接口实现类 - HashSet(P519)

    1. Hashset 的说明

    1)HashSet实现了Set接口
    2)HashSet实际上是HashMap

    1. public HashSet() {
    2. map = new HashMap<>();
    3. }

    3)可以存放null值,但是只能有一个 null
    4)HashSet不保证元素是有序的,取决于 hash 后,再确定索引的结果
    5)不能有重复元素/对象。

    2. Hashset底层机制说明(P522)

    分析 Hashset 底层是 HashMap,HashMap 底层是(数组+链表+红黑树)

    (1)HashSet 底层是 HashMap

    (2)添加一个元素时,先得到hash值-会转成->索引值

    (3)找到存储数据表 table,看这个索引位置是否已经存放的有元素

    (4)如果没有,直接加入

    (5)如果有,调用 equals 比较,如果相同,就放弃添加,如果不相同,则添加到最后

    (6)在 Java8 中,如果一条链表的元素个数超过 TREEIFY_THRESHOLD(默认是8),并且 table 的大小 >= MIN_TREEIFY_CAPACITY(默认64),就会进行树化(红黑树)

    三、Set 接口实现类 - LinkedHashset(P528)

    1. LinkedHashSet 的说明

    1)LinkedHashSet 是 Hashset 的子类

    2)LinkedHashSet 底层是一个 LinkedHashMap,底层维护了一个数组+双向链表

    3)LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,同时使用链表维护元素的次序(图),这使得元素看起来是以插入顺序保存的


    4)LinkedHashset 不允许添重复元素

     

    1)在 LinkedHashSet 中维护了一个 hash 表和双向链表(LinkedHashSet 有 head 和 tail )

    2)每一个节点有 pre 和 next 属性,这样可以形成双向链表

    3)在添加一个元素时,先求hash值,在求索引,确定该元素在 hashtable 的位置,然后将添加的元素加入到双向链表(如果已经存在,不添加【原则和 hashset 一样】)

    4)遍历 LinkedHashSet 也能确保插入顺序和遍历顺序一致

  • 相关阅读:
    【历史上的今天】8 月 3 日:微软研究院的创始人诞生;陌陌正式上线;苹果发布 Newton OS
    11_聚类算法
    redis使用rightPushAll保存List,List的size为1
    C++模拟OpenGL库——图形光栅化理论及实现(二):Brensenham直线算法
    使用python+mongodb实现股票网格交易代码
    【UE 材质】制作加载图案(2)
    并行Stream的性能测试
    在uni-app中引入uView
    ChatGPT3.5使用体验
    ROS点云的Pointpillars实时目标检测
  • 原文地址:https://blog.csdn.net/yirenyuan/article/details/126113015