java学习--HashSet

一、HashSet 是什么?

HashSet 是 Java 集合框架中java.util包下的实现类,它实现了Set接口,底层基于 HashMap 实现(可以理解为 HashSet 是 HashMap 的 “马甲”,只使用了 HashMap 的 key 部分,value 是一个固定的空对象)。

核心特点:

  • 无序:存储的元素不会按插入顺序、大小顺序等排列(底层是哈希表,元素位置由哈希值决定)。
  • 不可重复:不允许存储重复元素(通过hashCode()+equals()方法保证)。
  • 允许 null 值:但只能有一个 null(因为不可重复)。
  • 非线程安全:多线程环境下直接使用会有并发问题,可通过Collections.synchronizedSet(new HashSet<>())包装。
  • 查询 / 增删效率高:理想情况下时间复杂度为O(1)(哈希值不冲突时)。

二、核心原理(去重逻辑)

HashSet 判断两个元素是否重复的规则:

  1. 先调用元素的hashCode()方法,获取哈希值;
  2. 如果哈希值不同,直接判定为不同元素,存入集合;
  3. 如果哈希值相同,再调用equals()方法:
    • equals()返回true:判定为重复元素,不存入;
    • equals()返回false:判定为不同元素,存入(哈希冲突,会以链表 / 红黑树形式存储)。

注意:如果自定义类作为 HashSet 元素,必须重写hashCode()equals()方法,否则无法正确去重(默认使用 Object 类的方法,按内存地址判断)。

三、常用操作示例

下面是 HashSet 核心操作的完整代码,可直接运行:

import java.util.HashSet; import java.util.Iterator; public class HashSetDemo { public static void main(String[] args) { // 1. 创建 HashSet 对象 HashSet<String> set = new HashSet<>(); // 2. 添加元素(add) set.add("Apple"); set.add("Banana"); set.add("Orange"); set.add("Apple"); // 重复元素,不会被添加 set.add(null); // 允许添加一个 null System.out.println("初始集合:" + set); // 输出无序,比如 [null, Apple, Banana, Orange] // 3. 判断元素是否存在(contains) boolean hasBanana = set.contains("Banana"); System.out.println("是否包含Banana:" + hasBanana); // true // 4. 获取集合大小(size) System.out.println("集合大小:" + set.size()); // 4 // 5. 删除元素(remove) set.remove("Orange"); set.remove(null); System.out.println("删除后集合:" + set); // [Apple, Banana] // 6. 遍历 HashSet(三种方式) // 方式1:增强 for 循环(最常用) System.out.println("增强for循环遍历:"); for (String fruit : set) { System.out.println(fruit); } // 方式2:迭代器 System.out.println("迭代器遍历:"); Iterator<String> iterator = set.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } // 方式3:forEach 方法(Java 8+) System.out.println("forEach遍历:"); set.forEach(System.out::println); // 7. 清空集合(clear) set.clear(); System.out.println("清空后是否为空:" + set.isEmpty()); // true // 8. 自定义类作为元素(需重写 hashCode 和 equals) HashSet<Student> studentSet = new HashSet<>(); studentSet.add(new Student(1, "张三")); studentSet.add(new Student(1, "张三")); // 重复元素,不会添加 studentSet.add(new Student(2, "李四")); System.out.println("学生集合大小:" + studentSet.size()); // 2 } // 自定义学生类(重写 hashCode 和 equals 保证去重) static class Student { private int id; private String name; public Student(int id, String name) { this.id = id; this.name = name; } // 重写 hashCode:根据 id 和 name 生成哈希值 @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } // 重写 equals:id 和 name 都相同则判定为同一对象 @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Student other = (Student) obj; return id == other.id && (name == null ? other.name == null : name.equals(other.name)); } } }

四、HashSet vs TreeSet vs LinkedHashSet

特性HashSetTreeSetLinkedHashSet
底层结构哈希表(HashMap)红黑树(TreeMap)哈希表 + 双向链表
有序性无序自然顺序 / 自定义排序插入顺序
去重规则hashCode() + equals()实现 Comparable/ComparatorhashCode() + equals()
允许 null是(仅一个)是(仅一个)
效率高(O (1))中(O (log n))高(略低于 HashSet)
适用场景无需有序、高效去重需要排序的去重场景需要保留插入顺序的去重

总结

  1. HashSet 底层依赖 HashMap,核心特性是无序、不可重复、查询增删效率高,通过hashCode()+equals()保证去重。
  2. 自定义类作为 HashSet 元素时,必须重写hashCode()equals(),否则无法正确去重。
  3. 选择 Set 实现类的核心:无需有序用 HashSet,需排序用 TreeSet,需保留插入顺序用 LinkedHashSet。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1160726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java学习--LinkedHashSet

一、LinkedHashSet 是什么&#xff1f;LinkedHashSet 是 Java 集合框架中 java.util 包下的实现类&#xff0c;它继承自 HashSet&#xff0c;同时实现了 Set 接口&#xff0c;底层基于 LinkedHashMap 实现&#xff08;本质是「哈希表 双向链表」&#xff09;。可以把它理解为&…

渗透测试——Funbox2靶机渗透提权详细过程(FTP匿名登陆与SSH爆破)

今天继续给大家带来vulnhub系列的Funbox2靶机详细的渗透横提权过程&#xff1b; 本次渗透过程&#xff0c;也是学到了新知识&#xff1a; FTP匿名登陆下载文件使用SSH爆破工具登陆用户SUDO提权 文章目录前置准备信息收集访问http页面漏洞一&#xff1a;FTP(匿名登录功能)漏洞二…

必看!2026年EOR名义雇主品牌排行榜,探寻最值得信赖的EOR名义雇主服务解决方案

EOR名义雇主服务在现代企业管理中逐渐成为一种重要趋势。这类服务能够协助企业迅速适应全球市场&#xff0c;让用人更为灵活。通过合作优秀的EOR名义雇主服务商&#xff0c;企业能轻松解决合规问题&#xff0c;避免高昂的法律风险&#xff0c;同时提升薪资管理效率。根据最新的…

qt qbrush设置填充与取消填充

void MainWindow::paintEvent(QPaintEvent *event){QMainWindow::paintEvent(event);QPainter painter(this);painter.setBrush(Qt::blue);painter.drawRect(10, 10, 100, 100);//停止填充painter.setBrush(Qt::NoBrush);painter.drawRect(120, 10, 100, 100);}

为什么选择PPO而不是DQN

PPO vs DQN 的选择分析 为什么选择PPO而不是DQN 1. 动作空间特性 你的设计: 离散动作类型 连续参数调节DQN局限: 主要适用于纯离散动作空间PPO优势: 天然支持混合策略&#xff08;离散连续&#xff09; python # 你的混合动作空间 move_action_probs -> Categorical di…

告别高成本低效率!“轻竹办公AIPPT”高性价比搞定PPT制

告别高成本低效率&#xff01;“轻竹办公AIPPT”高性价比搞定PPT制作 在职场和校园里&#xff0c;制作PPT是一件让人又爱又恨的事情。很多职场人士和学生都有过这样的经历&#xff1a;为了一份汇报PPT或者课程作业PPT&#xff0c;花费大量时间&#xff0c;从搭建大纲到设计排版…

Springboot影视周边电商平台hlnap(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能&#xff1a;用户,商品分类,商品信息开题报告内容一、研究背景与意义&#xff08;一&#xff09;研究背景随着影视产业的蓬勃发展&#xff0c;影视作品的影响力日益扩大&#xff0c;其周边商品作为影视文化的重要延伸&#xff0c;市场需求急剧增长。影…

2026年降AIGC终极指南:10款主流降AI工具深度横评,看这篇就够了【建议收藏】

相信很多友友们&#xff0c;都在写论文时用过AI帮写&#xff0c;咱就是说&#xff0c;用AI写作虽然爽&#xff0c;但AI率太高真的会让人抓狂啊&#xff01; 我之前就吃过这亏&#xff0c;论文AI率高得离谱&#xff0c;被导师连环追问“这真是你写的吗&#xff1f;”。那段时间…

Springboot应急信息管理及统计分析系统5y51w(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,灾害分类,危害等级,灾害信息,应急联系方式,应急信息,伤亡统计,损失统计 开题报告内容 一、研究背景与意义 &#xff08;一&#xff09;现实背景 应急信息碎片化&#xff1a;2023年京津冀暴雨灾害中&#xff0c;应急部门需整合气…

TVS管并联提升通流为何反而导致钳位不稳?

在车载与工业电源设计中&#xff0c;工程师常通过并联TVS管提升通流能力以应对高强度浪涌。然而工程实测数据显示&#xff0c;简单并联往往导致钳位电压剧烈波动、器件提前失效&#xff0c;甚至保护功能完全丧失。问题根源在于TVS的半导体特性与电路寄生参数的深度耦合。 一、击…

安全左移:国产信创DevOps平台的安全(DevSecOps)构建与实践

在信创产业全面进入 “体系化替代” 的深水区&#xff0c;DevOps 平台作为软件研发的核心枢纽&#xff0c;其安全能力已不再是 “附加项”&#xff0c;而是决定信创转型成败的 “底线要求”。传统 DevOps 流程中 “重交付、轻安全” 的模式&#xff0c;在信创环境下因国产软硬件…

2026实测:10款免费的AI降重工具,真正能降AI工具推荐,亲测有效【避坑指南】

相信很多友友们&#xff0c;都在写论文时用过AI帮写&#xff0c;咱就是说&#xff0c;用AI写作虽然爽&#xff0c;但AI率太高真的会让人抓狂啊&#xff01; 我之前就吃过这亏&#xff0c;论文AI率高得离谱&#xff0c;被导师连环追问“这真是你写的吗&#xff1f;”。那段时间…

破局多平台管理困境:一体化终端管理如何成为企业效率引擎?

在当今混合办公与BYOD&#xff08;自带设备&#xff09;已成为常态的时代&#xff0c;企业的IT版图从未如此复杂。Windows、macOS、Linux、Android、iOS……多平台设备在赋予业务灵活性的同时&#xff0c;也为IT管理者织就了一张巨大的“管理迷网”。效率的隐形杀手&#xff1a…

2026降AIGC工具大盘点:免费、在线、一键生成,亲测10款降ai工具,到底哪个更适合你?

相信很多友友们&#xff0c;都在写论文时用过AI帮写&#xff0c;咱就是说&#xff0c;用AI写作虽然爽&#xff0c;但AI率太高真的会让人抓狂啊&#xff01; 我之前就吃过这亏&#xff0c;论文AI率高得离谱&#xff0c;被导师连环追问“这真是你写的吗&#xff1f;”。那段时间…

论文AI率太高怎么办?亲测这10款降AI率工具,手把手教你如何降低ai率【2026最新】

相信很多友友们&#xff0c;都在写论文时用过AI帮写&#xff0c;咱就是说&#xff0c;用AI写作虽然爽&#xff0c;但AI率太高真的会让人抓狂啊&#xff01; 我之前就吃过这亏&#xff0c;论文AI率高得离谱&#xff0c;被导师连环追问“这真是你写的吗&#xff1f;”。那段时间…

1_4_五段式SVPWM (传统算法反正切+DPWM0)算法理论与 MATLAB 实现详解

Simulink仿真自资源及详解 1-4-五段式SVPWM&#xff08;传统算法反正切DPWM0&#xff09;算法理论与MATLAB实现详解资源-CSDN下载https://download.csdn.net/download/m0_37724753/92560561?spm1001.2014.3001.5503 1_4_五段式SVPWM &#xff08;传统算法反正切DPWM0&#xf…

AI率从90%降到10%,亲测有效的降AI率工具,这10款总有一款适合你的论文降AIGC!

相信很多友友们&#xff0c;都在写论文时用过AI帮写&#xff0c;咱就是说&#xff0c;用AI写作虽然爽&#xff0c;但AI率太高真的会让人抓狂啊&#xff01; 我之前就吃过这亏&#xff0c;论文AI率高得离谱&#xff0c;被导师连环追问“这真是你写的吗&#xff1f;”。那段时间…

搞懂 SVPWM 不用愁!这份 “保姆级” 算法 + MATLAB 实操资源来了

搞懂 SVPWM 不用愁&#xff01;这份 “保姆级” 算法 MATLAB 实操资源来了 还在为 SVPWM 的七段式 / 五段式算法头疼&#xff1f;还在搜遍全网找不到从理论到 MATLAB 代码的完整教程&#xff1f; 别慌&#xff01;接下来我会陆续放出超全 SVPWMSPWM 学习资源&#xff0c;直接…

单电感玩转电池均衡:一个Buck-Boost引发的“血案

Simulink仿真&#xff1a;一种单电感双向电池均衡电路&#xff08;CSCD,EI,CSTPCD,北核&#xff09; 关键词&#xff1a;电池均衡;单电感;Buck-Boost;电感复用;均衡控制 参考文献&#xff1a;一种单电感双向电池均衡电路提前录制的视频 仿真平台&#xff1a;MATLAB/Simulink 主…

1_3_五段式SVPWM (传统算法反正切+DPWMmax)算法理论与 MATLAB 实现详解

Simulink仿真及详解 1-3-五段式SVPWM&#xff08;传统算法反正切DPWMmax&#xff09;算法理论与MATLAB实现详解资源-CSDN下载https://download.csdn.net/download/m0_37724753/92560528?spm1001.2014.3001.5503 1_3_五段式SVPWM &#xff08;传统算法反正切DPWMmax&#xff0…