课堂要点回顾Set 是接口继承 Collection无索引、元素不能重复不能使用普通 for 循环遍历HashSet 底层哈希表无序去重自定义类存入 HashSet 必须重写hashCode()、equals()否则无法按业务属性去重LinkedHashSet 底层哈希表 双向链表存取顺序一致、依旧去重维护链表带来额外内存与性能开销集合不能直接存基本数据类型必须使用包装类集合也可以存放自定义实体类实体类要点属性私有封装、get/set、构造方法、重写toString()用于对象打印输出Set 全部遍历方式迭代器、增强 for、forEach (Lambda / 匿名内部类)和 List 通用一、Set 接口1. 特点属于Collection子接口没有索引不能用普通 for 循环依靠下标 get遍历元素不允许重复自带去重能力存取顺序是否一致取决于具体实现类HashSet 无序LinkedHashSet 存取有序TreeSet 排序方法全部继承自Collectionadd、remove、contains、size、clear、isEmpty()课堂提示List 可以get(索引)获取元素Set 没有索引没有 get 方法想要查找元素只能遍历。2. Set 的三种实现类实现类底层结构特点HashSet哈希表数组 链表 红黑树 JDK8无序、去重读写速度快LinkedHashSet哈希表 双向链表存取顺序一致、去重链表带来额外开销TreeSet平衡二叉树红黑树元素大小排序、去重下一期讲解3. Set 集合遍历全部 3 种方式和 List 通用SetString set new HashSet(); set.add(张三); set.add(李四); //①迭代器 IteratorString it set.iterator(); while(it.hasNext()){ System.out.println(it.next()); } //②增强for循环 for(String s : set){ System.out.println(s); } //③forEach支持匿名内部类 / Lambda表达式课堂讲到Consumer函数式接口 //匿名内部类写法 set.forEach(new ConsumerString() { Override public void accept(String s) { System.out.println(s); } }); //Lambda简写 set.forEach(s - System.out.println(s)); //方法引用简写 set.forEach(System.out::println);课堂重点forEach 底层使用Consumer函数式接口接口中只有一个accept()抽象方法接收参数无返回值。二、HashSet1. 底层与特点底层哈希表存取顺序无序不保证存入和取出顺序一致可以存入null最多允许一个 null线程不安全增删查询效率很高默认初始容量 16加载因子 0.75达到阈值自动扩容为原来 2 倍链表长度≥8 且数组≥64 转为红黑树2. add 添加元素、去重完整流程课堂讲解 “桶” 机制调用对象hashCode()得到哈希值通过哈希值计算数组存储位置桶的位置如果该桶位置没有元素 → 直接存入如果桶位置已经存在元素哈希冲突比较两个对象哈希值哈希值不同挂到链表后面哈希值相同调用equals()做内容比较equalstrue判定重复元素舍弃不存入实现去重equalsfalse不是重复挂到链表节点后面⚠️课堂强调HashSet 去重依赖hashCode() equals()两个方法同时生效缺一不可JDK 自带类String、Integer已经重写好这两个方法可以直接去重自定义实体类不重写则按照对象地址比较业务上无法实现去重3. 自定义实体类存入 HashSet课堂 Student 实体案例实体类编写规范封装思想成员变量private 私有保护数据安全提供无参、有参构造方法根据业务需要编写 get、set 方法不需要就不写不是必须全部生成重写toString()打印对象时输出属性内容否则打印类名内存地址如果需要 HashSet 按业务属性去重必须重写hashCode()和equals()import java.util.Objects; //实体类对应现实业务实体未来可以映射数据库表 class Student{ private Integer id; private String name; //无参构造 public Student() {} //有参构造 public Student(Integer id, String name) { this.id id; this.name name; } //get、set public Integer getId() { return id; } public void setId(Integer id) { this.id id; } public String getName() { return name; } public void setName(String name) { this.name name; } //重写toString输出对象时展示属性而不是内存地址 Override public String toString() { return Student{id id , name name }; } //重写hashCode equals业务规则id相同就视为同一个学生做去重 Override public boolean equals(Object o) { //1.同一个对象地址完全相同直接true if (this o) return true; //2.判断对象是否为null判断类型是否一致 if (o null || getClass() ! o.getClass()) return false; //向下转型 Student student (Student) o; //业务规则只比较学号id return Objects.equals(id, student.id); } Override public int hashCode() { //只使用id计算哈希值 return Objects.hash(id); } }测试代码HashSetStudent stuSet new HashSet(); stuSet.add(new Student(1001,小明)); stuSet.add(new Student(1001,小明二号)); //id重复会被去重丢弃 stuSet.add(new Student(1002,小红)); stuSet.forEach(System.out::println);这里只对比 id哪怕 name 名字不一样只要 id 相同就判定重复。重写 equals、hashCode 时根据业务需求确定比较哪些属性。三、LinkedHashSet1. 底层和特点底层哈希表 双向链表依旧元素不可重复依靠 hashCodeequals 去重双向链表记录元素添加顺序存取顺序保持一致缺点需要维护双向链表占用更多内存增删操作会有额外性能开销LinkedHashSetString lhs new LinkedHashSet(); lhs.add(A); lhs.add(B); lhs.add(C); //遍历输出顺序A B C 和添加顺序完全一致 lhs.forEach(System.out::println);2. HashSet 与 LinkedHashSet 对比课堂总结项目HashSetLinkedHashSet底层哈希表数组 链表 红黑树哈希表 双向链表存取顺序无序不保证顺序存取顺序保持一致性能增删查询快开销小性能略低维护链表有开销内存占用较小更大需要存储双向链表指针适用场景只需要去重不关心顺序开发最常用需要保留元素存入顺序同时做去重课堂建议没有顺序需求优先使用HashSet需要保证存入顺序再选LinkedHashSet。四、课堂高频易错汇总Set 没有索引没有 get (int index) 方法遍历只能迭代器、增强 for、forEach不能普通 for 下标遍历。集合不能存储基本类型必须使用包装类如HashSetInteger不能写HashSetint。自定义类存入 HashSet 想要业务去重必须重写hashCode()和equals()只重写其中一个去重会失效。toString()不重写打印对象输出内存地址重写后打印对象属性方便调试输出。LinkedHashSet 有序≠排序只是记录添加的先后顺序想要按大小排序用 TreeSet。遍历 Set 的时候不要直接用集合 add/remove 修改集合会触发并发修改异常需要删除用迭代器it.remove()。五、速记口诀Set 接口无索引元素重复不允许HashSet 哈希表无序去重效率好自定义类存集合hashCode equals 不能少LinkedHash 加链表存入取出顺序保链表维护有开销需要顺序才去找实体类要封装好toString 打印巧遍历三种方式记迭代增强 forEach。
企业数字化 ERP 产品动态
相关推荐
如何把科研论文写清楚?从 Cormac McCarthy 的建议到可执行的修改方法 本文导读:论文写作不只是检查语法,还要让读者迅速理解研究问题、方法、证据和结论。本文根据 Nature 刊登的 Cormac McCarthy 科研写作建议,结合计算机与工程领域的示例,介绍如何确定论文主线、组织段落、精简句子、解释公式&… · 2026/11/4 7:18:34
未能加载文件或程序集“CefSharp.Core.Runtime.dll”或它的某一个依赖 这个情况是在个别电脑出现的问题,以下是报错提示。 官网:链接 X86:https://aka.ms/vs/17/release/vc_redist.x86.exe X64:https://aka.ms/vs/17/release/vc_redist.x64.exe 还是不行的话 就是缺少VC 运行库
X86:http… · 2026/11/4 7:18:34
Zero远控_04:纯Python轻量远程控制框架,无依赖嵌入式远控方案 简介:本资源是「Zero远控」系列教程的第四部分,面向网络安全初学者、嵌入式开发学习者及远程控制技术实践者,聚焦远程控制核心原理与Qt框架下的C实现。内容涵盖客户端/服务器双端架构设计、TCP通信建模、身份验证流程、AES加密传输机制及跨平… · 2026/11/4 7:59:40
深入解析muduo网络库中的EPollPoller模块 1. muduo网络库中的EPollPoller模块解析在Linux高并发网络编程领域,事件驱动模型是核心架构之一。muduo作为国内广泛使用的C网络库,其事件循环实现堪称教科书级别的设计。今天我们就来深入剖析其中最关键的EPollPoller模块,看看一个工业级的事… · 2026/11/4 7:59:40
SGLang 适配 AMD 平台的开发工作全面梳理 SGLang 的核心分层是:纯 Python 的调度/前端层(硬件无关)→ 算子与后端层(sgl-kernel、attention backend、MoE、量化、通信)→ 构建/运行环境层。从 NVIDIA 迁到 AMD,绝大部分工作集中在后两层。下面按模块… · 2026/11/4 7:59:40
Wi-Fi 7校园网部署实践与高密度场景优化 1. 项目背景与核心价值 湖州职业技术学院近期完成了全校Wi-Fi 7网络的全覆盖部署,成为国内首批实现Wi-Fi 7校园网全覆盖的高职院校。这个项目不仅仅是简单的网络升级,而是智慧校园建设的基础性工程。作为参与过多个校园网改造的工程师,我特别… · 2026/11/4 7:59:40
零基础入门深度学习:为什么首选PyTorch及避坑指南 简介:这份PDF面向深度学习初学者与PyTorch入门者,围绕“从基础到实践”的学习路径,系统讲解Numpy基础、Tensor与Autograd、神经网络工具箱nn、数据处理与可视化工具,并延伸到机器学习基础、卷积神经网络、循环神经网络及生成式模型… · 2026/11/4 7:59:40
商品状态机设计:解决电商库存、价格、上下架一致性问题 简介:本资源是一个基于ASP.NET开发的网络商品销售管理系统源码包,面向Web开发初学者与.NET技术实践者,聚焦商品维护、订单处理与库存管理等核心电商功能实现。压缩包共55个文件,含15个DLL动态库(封装业务逻辑ÿ… · 2026/11/4 7:58:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38