Java遍历HashSet有增强for循环、Iterator、转数组、forEach+Lambda四种方式;因HashSet无序,遍历顺序不确定;Iterator支持安全删除;并发修改需用CopyOnWriteArraySet或同步。

Java 中遍历 HashSet 元素有多种方式,核心是利用它实现了 Iterable 接口,因此支持增强 for 循环、迭代器等标准遍历手段。由于 HashSet 不保证元素顺序(底层是哈希表),遍历时的顺序是不确定的。
使用增强 for 循环(最常用)
语法简洁,适合大多数场景,无需手动管理迭代器:
<pre class="brush:php;toolbar:false;">HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("cherry");
for (String item : set) {
System.out.println(item);
}
注意:输出顺序不固定,可能每次运行都不同,比如可能是 banana → apple → cherry,也可能其他排列。
使用 Iterator 手动遍历
适合需要在遍历中删除元素的场景(用 iterator.remove() 安全删除),避免 ConcurrentModificationException:
立即学习“Java免费学习笔记(深入)”;
- 调用
set.iterator()获取迭代器 - 用
hasNext()判断是否还有元素 - 用
next()获取当前元素 - 如需删除,必须用
iterator.remove(),不能直接调用set.remove()
<pre class="brush:php;toolbar:false;">Iterator<String> it = set.iterator();
while (it.hasNext()) {
String item = it.next();
System.out.println(item);
// 若想删除满足条件的元素,例如长度大于 5 的字符串:
// if (item.length() > 5) it.remove();
}
转换为数组后遍历(较少用)
适用于需要随机访问或配合旧式数组逻辑的场景,但会额外创建数组对象,有内存开销:
<code>Object[] array = set.toArray(); // 返回 Object[] 类型
for (Object obj : array) {
System.out.println((String) obj); // 注意类型强转
}
// 或指定泛型数组(推荐写法)
String[] strArray = set.toArray(new String[0]);
for (String s : strArray) {
System.out.println(s);
}
使用 forEach + Lambda(Java 8+)
函数式风格,代码更紧凑,适合简单操作:
<code>set.forEach(System.out::println);
// 或自定义逻辑
set.forEach(item -> {
if (item.startsWith("a")) {
System.out.println("以 a 开头: " + item);
}
});
注意:Lambda 中不能修改外部局部变量(除非是 final 或事实 final),也不能直接 break/continue,如需中断建议改用传统循环。
不复杂但容易忽略:所有方式遍历的都是当前快照,遍历过程中若其他线程修改了集合,可能抛出 ConcurrentModificationException。如需并发安全,应考虑 <code>CopyOnWriteArraySet 或加锁同步。


















