hashset遍历不保证顺序但确保元素不重复,推荐增强for循环;需边遍历边删除时用iterator;复杂操作可转stream或数组,不可用索引访问。

Java 中的 HashSet 本身不保证顺序,但遍历它时能自然拿到所有不重复的元素——因为它的底层就是靠哈希表去重的,重复元素在添加时就被自动忽略了。所以“遍历所有不重复的元素”,本质上就是遍历这个集合本身。
用增强 for 循环(最常用)
这是最简洁、可读性最好的方式,适合大多数场景:
HashSet<string> set = new HashSet();
set.add("apple");
set.add("banana");
set.add("apple"); // 重复,不会加入
set.add("cherry");
for (String item : set) {
System.out.println(item);
}
</string>
输出顺序不确定(比如可能是 banana → cherry → apple),但每个元素只出现一次,且全部不重复。
用 Iterator 手动遍历(需要控制流程时)
当你需要边遍历边删除元素,或想提前退出、做条件判断时,推荐用 Iterator:
- 调用
set.iterator()获取迭代器 - 用
hasNext()判断是否还有元素 - 用
next()取出当前元素 - 删除要用
iterator.remove(),不能直接调set.remove(),否则会抛ConcurrentModificationException
Iterator<string> it = set.iterator();
while (it.hasNext()) {
String s = it.next();
if (s.startsWith("a")) {
it.remove(); // 安全删除
}
}
</string>
转成数组或流再处理(配合其他操作)
如果要排序、过滤、统计等,可以转成 Stream 或数组:
- 转 Stream:用
set.stream(),之后链式调用filter、sorted、forEach等 - 转数组:用
set.toArray(new String[0])(推荐带泛型参数的写法,避免类型转换)
// 按字母顺序打印(需先转为有序结构)
set.stream()
.sorted()
.forEach(System.out::println);
// 转数组后遍历
String[] arr = set.toArray(new String[0]);
for (String s : arr) {
System.out.println(s);
}
注意:不要用传统 for + 索引
HashSet 没有按索引访问的方法(比如 get(i)),因为它不是基于数组或链表索引设计的。下面这种写法是错的:
// ❌ 编译不通过!HashSet 没有 get(int index) 方法 for (int i = 0; i <p>不复杂但容易忽略:只要用对遍历方式,HashSet 的“不重复”特性就天然生效,你拿到的就是去重后的全部元素。</p>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











