码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 集合_Collection_HashSet简述


    HashSet的方法:继承自Set 或者说Collection(与List不同的是 List中新增了许多关于index的方法)
    
    HashSet的特点:无序 无重复 无索引
            无序是指元素取出时的顺序与添加时的顺序不一致 但取出的顺序是固定的(顺序取决于元素hash后的结果)
            无重复是指无法在集合中存放重复的元素
            无索引是指无法通过索引获取或操作集合中的元素
    
    HashSet的底层:HashMap 而HashMap的底层是 数组 + 单向链表(提高存取效率) + 红黑树(在链表达到一定长度之后会被替换为红黑树 红黑树可以提高检索效率)​
    
    HashSet添加元素的过程:
            01.获取元素的hash值 并将其转换为索引值
            02.查看table(HashMap内部维护的一个Node数组)对应索引位置是否已添加元素 若未添加则直接添加 反之则调用equals方法进行判断(若该索引处存储了多个元素 则需要由头结点至尾结点逐一判断) 若存在相同元素则放弃添加 反之则添加至链表尾端
            03.在Java8中 添加元素时 若该链表的长度>=TREEIFY_THRESHOLD(默认为8) 并且table.length>=MIN_TREEIFY_CAPACITY(默认为64)时 该链表就会进行树化(红黑树)
            注:添加元素时若该链表的长度>=TREEIFY_THRESHOLD 则会开始树化 即添加第九个元素时 链表会开始树化
    

    关于HashSet的特点

    无序与无重复:

    1. public class HashSetSource {
    2. public static void main(String[] args) {
    3. Set set = new HashSet<>();
    4. //不允许添加重复元素
    5. set.add("jerry");
    6. set.add("tom");
    7. set.add(null);
    8. set.add("jerry");
    9. set.add("tom");
    10. set.add(null);
    11. System.out.println(set);
    12. //加深理解
    13. set.add(new Cat("cat"));
    14. set.add(new Cat("cat"));
    15. System.out.println(set);
    16. //再次加深理解
    17. //不能被一同放入的原因是String类的equals方法与hashCode方法均被重写
    18. set.add(new String("spike"));
    19. set.add(new String("spike"));
    20. System.out.println(set);
    21. }
    22. }
    23. class Cat{
    24. String name;
    25. public Cat(String name) {
    26. this.name = name;
    27. }
    28. @Override
    29. public String toString() {
    30. return "Cat{" +
    31. "name='" + name + '\'' +
    32. '}';
    33. }
    34. }
    35. 无索引:方法均与索引无关,即无法通过索引获取或操作集合中的元素

      关于数组 + 单向链表:

      1. //模拟HashSet(HashMap)的底层结构:数组 + 链表
      2. public class HashSetStructure {
      3. public static void main(String[] args) {
      4. //创建结点数组 结点数组常被称为"表"
      5. Node[] table = new Node[8];
      6. //创建结点
      7. Node node01 = new Node("ONE", null);
      8. Node node02 = new Node("TWO", null);
      9. Node node03 = new Node("THREE", null);
      10. //链接结点
      11. table[0] = node01;
      12. node01.next = node02;
      13. node02.next = node03;
      14. //输出链表
      15. System.out.println(table[0]);
      16. }
      17. }
      18. class Node{
      19. Object item;
      20. Node next;
      21. public Node(Object item, Node next) {
      22. this.item = item;
      23. this.next = next;
      24. }
      25. @Override
      26. public String toString() {
      27. return "Node{" +
      28. "item=" + item +
      29. ", next=" + next +
      30. '}';
      31. }
      32. }

      若觉得输出结果不够直观,可以参考Debug图

    36. 相关阅读:
      Qt之qobject_cast实现
      一篇万字博文带你入坑爬虫这条不归路 【万字图文】
      HackQuest介绍 web3 学习平台
      解读Gartner2022年组装式应用报告:从组装式企业到组装式应用
      C++数据结构X篇_11_C++栈的应用-后缀表达式求解
      APS成功实施的关键要点
      含文档+PPT+源码等]精品基于Uniapp+SSM实现的移动端的家庭客栈管理系统实现的App[包运行成功]
      cesium 雷达扫描 (扫描线)
      好用的WPF开源UI框架项目
      9.ClickHouse系列之数据一致性保证
    37. 原文地址:https://blog.csdn.net/Mudrock__/article/details/126906428
      • 最新文章
      • 沪漂五周年了:我越来越迷茫了
        Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
        MySQL-Seconds_behind_master的精度误差
        [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
        AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
        Agent OS :五种驯服不确定性的范式
        PortSwigger SQL注入LAB11
        数据库即时编译JIT
        [Begin]AI Learn Data Day 0
        深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      小工具 小游戏
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

      京公网安备 11010502049817号