Java中HashSet删除元素用remove()方法,依据equals()和hashCode()判断逻辑相等;自定义对象需重写这两方法;遍历时须用Iterator.remove()避免异常;批量删除用removeAll()。

Java 中 HashSet 删除指定元素,直接调用 remove() 方法即可,传入要删除的对象作为参数。该方法会根据对象的 equals() 和 hashCode() 判断是否匹配并移除——前提是对象的这两个方法实现正确。
使用 remove() 方法删除元素
HashSet 的 remove(Object o) 方法是标准且最常用的方式:
- 如果集合中存在与参数
o相等(equals()返回 true)的元素,就将其删除,并返回true; - 否则不修改集合,返回
false; - 注意:删除的是“逻辑相等”的元素,不是内存地址相同的对象(除非是同一引用)。
示例:
HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("cherry");
boolean removed = set.remove("banana"); // true
System.out.println(set); // [apple, cherry]
删除自定义对象时的关键点
若 HashSet 存储的是自定义类(如 Person),必须重写 hashCode() 和 equals() 方法,否则 remove() 很可能失败:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 未重写时,默认使用
Object的实现,只比较引用地址; - 即使两个
Person("Alice", 25)内容相同,若不是同一个对象实例,remove()找不到目标; - 正确做法:按业务关键字段(如 name + age)生成哈希码,并在
equals()中做对应判断。
遍历时安全删除(避免 ConcurrentModificationException)
不能在增强 for 循环或迭代器遍历过程中直接调用 set.remove(),否则抛出并发修改异常。应使用迭代器的 remove() 方法:
- 获取
Iterator; - 用
it.hasNext()和it.next()遍历; - 满足条件时调用
it.remove()(这是唯一线程安全的删除方式)。
示例:
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String s = it.next();
if (s.startsWith("a")) {
it.remove(); // ✅ 安全删除
}
}
批量删除多个元素
可用 removeAll(Collection<?> c) 一次性删掉集合中存在的所有匹配项:
- 参数是任意
Collection,比如另一个HashSet、ArrayList或数组转成的列表; - 内部仍基于
equals()匹配,所以同样依赖正确实现; - 返回
true表示至少删了一个元素。
示例:
HashSet<String> toRemove = new HashSet<>(Arrays.asList("apple", "cherry"));
set.removeAll(toRemove); // 删除所有在 toRemove 中存在的元素

















