Iterator是遍历集合并安全移除元素的关键工具,通过hasNext()和next()方法遍历,用remove()避免ConcurrentModificationException;增强for循环简洁但无法安全删除元素;Java 8的Stream API适合数据处理与转换,而Iterator在需修改集合时仍不可替代。

在Java中,
Iterator
Iterator
要使用
Iterator
Iterator
hasNext()
next()
remove()
下面是一个具体的例子:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorExample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");
fruits.add("Grape");
fruits.add("Banana"); // 再次添加一个香蕉
System.out.println("原始列表: " + fruits);
// 获取迭代器
Iterator<String> iterator = fruits.iterator();
// 遍历并移除所有 "Banana"
System.out.println("开始遍历并移除 'Banana'...");
while (iterator.hasNext()) {
String fruit = iterator.next(); // 获取当前元素
System.out.println("正在处理: " + fruit);
if ("Banana".equals(fruit)) {
iterator.remove(); // 使用迭代器安全移除元素
System.out.println("已移除 'Banana'");
}
}
System.out.println("移除 'Banana' 后的列表: " + fruits);
// 再次遍历,这次只是打印
System.out.println("\n再次遍历剩余元素:");
Iterator<String> secondIterator = fruits.iterator();
while (secondIterator.hasNext()) {
System.out.println(secondIterator.next());
}
}
}这段代码展示了
Iterator
fruits
fruits.remove(fruit)
ConcurrentModificationException
iterator.remove()
Iterator
立即学习“Java免费学习笔记(深入)”;
Iterator
这是个很常见的问题,也常常让人纠结。简单来说,增强for循环(
for-each
Iterator
Iterable
增强for循环的语法简洁优雅,非常适合只进行读取操作的遍历。比如,你只是想打印集合中的所有元素,或者对每个元素执行一些不涉及修改集合结构的操作,那么增强for循环无疑是首选,它代码量少,可读性高。
然而,如果你在遍历过程中需要从集合中移除元素,那么增强for循环就会让你头疼了。在增强for循环内部,如果你尝试通过集合自身的
remove()
ConcurrentModificationException
而
Iterator
remove()
iterator.remove()
ConcurrentModificationException
如何选择?
我的经验是,如果我只是想简单地遍历集合,不涉及任何修改操作,我会毫不犹豫地选择增强for循环,因为它更简洁。但只要我想到需要在遍历时移除元素,我的脑子里就会立刻浮现
Iterator
hasNext()
next()
Iterator
Iterator
即使
Iterator
常见陷阱:
ConcurrentModificationException
Iterator
add()
remove()
iterator.remove()
ConcurrentModificationException
java.util
next()
hasNext()
iterator.next()
iterator.hasNext()
next()
NoSuchElementException
remove()
iterator.remove()
next()
next()
remove()
IllegalStateException
remove()
next()
最佳实践:
iterator.remove()
Iterator
remove()
ConcurrentModificationException
java.util.concurrent
CopyOnWriteArrayList
while (iterator.hasNext())
next()
remove()
while (iterator.hasNext()) { element = iterator.next(); if (condition) { iterator.remove(); } }Iterator
Java 8 引入的 Stream API 彻底改变了我们处理集合的方式,它提供了一种更声明式、函数式编程风格的集合处理方法。虽然 Stream API 并不是
Iterator
forEach()
Consumer
List<String> names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie"));
names.forEach(name -> System.out.println("Hello, " + name));这个方法简洁明了,但它同样不适合在遍历时修改集合。如果你尝试在
forEach
ConcurrentModificationException
Stream API 的链式操作: 这是 Java 8 集合处理的真正亮点。通过将集合转换为
Stream
filter
map
sorted
collect
reduce
count
List<String> products = Arrays.asList("Laptop", "Mouse", "Keyboard", "Monitor", "Mouse");
// 筛选出包含 "Mouse" 的产品,并收集到一个新列表
List<String> mice = products.stream()
.filter(p -> p.contains("Mouse"))
.collect(Collectors.toList());
System.out.println("包含 'Mouse' 的产品: " + mice);
// 统计不重复的产品数量
long distinctProductCount = products.stream()
.distinct()
.count();
System.out.println("不重复的产品数量: " + distinctProductCount);Stream API 的优势在于其表达力、可读性以及对并行处理的良好支持。它鼓励一种“数据管道”的思维,将数据处理过程分解为一系列独立的、可组合的操作。
选择的考量:
在我看来,
Iterator
forEach
如果我的目标只是简单地对每个元素执行一个操作,
forEach
Iterator
Iterator
remove()
以上就是Java中如何使用Iterator遍历集合的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号