news 2026/7/23 11:14:25

java学习--HashSet

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 5:18:47

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

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

作者头像 李华
网站建设 2026/7/22 9:04:28

1986-2023年并购SDC数据库数据

并购SDC数据库通过收集、整理和分析并购交易数据&#xff0c;为学术研究、企业战略决策、投资分析等提供关键数据支持。 收录了自1986年以来全球范围内的并购、收购、资产剥离等各类交易信息。该数据库提供交易金额、支付方式、溢价水平、双方财务数据及行业分类等丰富指标。 …

作者头像 李华
网站建设 2026/7/17 14:17:16

python基于flask框架的在线编程学习系统设计与实现

目录基于Flask框架的在线编程学习系统设计与实现摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于Flask框架的在线编程学习系统设计与实现摘要 该系统采用Python语言与Flask轻量级框…

作者头像 李华
网站建设 2026/7/19 15:58:08

Day01-07.搭建项目环境-测试部署的微服务14:20

就是之前做过的那个单体项目&#xff0c;小程序&#xff0c;的微服务版本&#xff0c;加了一些主流技术栈&#xff0c;挺好的&#xff0c;可以上手实操看看。把学过的技术栈实操看看。每次工作有时间了&#xff0c;就学点新技术没时间也要创造时间&#xff0c;目前就是创造时间…

作者头像 李华
网站建设 2026/7/19 15:58:00

Agent搭建-超详细教程,存一下吧

AI Agent在于其能自动执行复杂任务&#xff0c;大幅提升自动化和智能决策的效率&#xff0c;让任务自动化&#xff0c;主要包括感知、记忆、规划与决策、行动/使用工具。 AI Agent的工作原理分为几个步骤。 ✔首先是感知&#xff0c;AI Agent通过传感器感知物理或虚拟环境中的变…

作者头像 李华