Java中使用for和Iterator遍历List集合的区别

在 Java 中,遍历 List 可以使用 for 循环Iterator 两种方式。它们各有优缺点,适用于不同的场景。以下是它们的区别和适用场景:

1. 语法和使用方式

for 循环

  • 使用索引遍历列表。

  • 示例:

java 复制代码
List<String> list = Arrays.asList("A", "B", "C");
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

//或者
List<String> list = Arrays.asList("A", "B", "C");
for (String str:list) {
    System.out.println(str);
}

Iterator

  • 使用 Iterator 对象遍历列表。

  • 示例:

java 复制代码
List<String> list = Arrays.asList("A", "B", "C");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

2. 性能

  • for 循环

    • 对于 ArrayList 等基于数组实现的列表,for 循环性能较好,因为 get(i) 是常数,时间复杂度(O(1))。

    • 对于 LinkedList 等基于链表实现的列表,get(i) 的时间复杂度是 O(n),性能较差。

  • Iterator

    • 对于所有 List 实现,Iterator 的性能都较好,因为它内部会优化遍历方式。

      • 对于 ArrayListIterator 通过索引直接访问元素。

      • 对于 LinkedListIterator 通过链表指针遍历,避免重复计算。

3. 并发修改

  • for 循环

    • 在遍历过程中修改列表(如删除元素)会导致 ConcurrentModificationException

    • 示例:

java 复制代码
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
for (int i = 0; i < list.size(); i++) {
    if (list.get(i).equals("B")) {
        list.remove(i); // 可能抛出 ConcurrentModificationException
    }
}

Iterator

  • 使用 Iteratorremove() 方法可以在遍历时安全地删除元素,不会抛出异常。

  • 示例:

java 复制代码
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String item = iterator.next();
    if (item.equals("B")) {
        iterator.remove(); // 安全删除
    }
}

4. 功能扩展

  • for 循环

    • 只能用于遍历,功能较为单一。

    • 如果需要删除元素,需要额外处理索引。

  • Iterator

    • 提供了 remove() 方法,支持在遍历时删除元素。

    • 可以通过 ListIterator 实现双向遍历(向前和向后)以及修改元素。

5. 代码可读性

  • for 循环

    • 代码直观,适合简单的遍历场景。

    • 对于复杂的操作(如删除元素),代码可能变得冗长。

  • Iterator

    • 代码稍显复杂,但功能更强大。

    • 适合需要删除元素或复杂操作的场景。

6. 适用场景

  • for 循环

    • 适合遍历 ArrayList 等基于数组实现的列表。

    • 适合不需要修改列表的场景。

  • Iterator

    • 适合遍历所有类型的 List,尤其是 LinkedList

    • 适合需要在遍历时删除或修改元素的场景。

从上面的比较中可以看出,当list为**LinkedList或者需要对元素进行修改删除操作时,从性能和安全性考虑,Iterator可适合。**

相关推荐
专注VB编程开发20年5 小时前
vb.net datatable新增数据时改用数组缓存
java·linux·windows
(>_<)5 小时前
java minio 分片上传工具类与测试demo
java·minio·分片上传
不想打工的码农5 小时前
MyBatis-Plus多数据源实战:被DBA追着改配置后,我肝出这份避坑指南(附动态切换源码)
java·后端
Coder_Boy_5 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例
java·人工智能·spring boot·后端·spring
踢足球09296 小时前
寒假打卡:2026-2-7
java·开发语言·javascript
闻哥6 小时前
Kafka高吞吐量核心揭秘:四大技术架构深度解析
java·jvm·面试·kafka·rabbitmq·springboot
金牌归来发现妻女流落街头6 小时前
【Springboot基础开发】
java·spring boot·后端
考琪6 小时前
Nginx打印变量到log方法
java·运维·nginx
wangjialelele6 小时前
Linux中的进程管理
java·linux·服务器·c语言·c++·个人开发
历程里程碑6 小时前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse