List集合有哪些常见的遍历方式?

参考回答

List 集合是 Java 中常用的集合类型,支持多种遍历方式。以下是常见的 List 遍历方法:

  1. 增强型 for 循环(for-each)
  2. 普通 for 循环
  3. Iterator 遍历
  4. ListIterator 遍历
  5. Stream API(Java 8+)
  6. forEach 方法(Java 8+)

详细讲解与示例

1. 增强型 for 循环

  • 特点
    • 简洁易用。
    • 遍历过程中不需要显式管理索引。
    • 适用于读取元素(不可修改集合结构)。
  • 示例
    import java.util.ArrayList;
    import java.util.List;
    
    public class ForEachLoop {
      public static void main(String[] args) {
          List<String> list = new ArrayList<>();
          list.add("A");
          list.add("B");
          list.add("C");
    
          for (String item : list) {
              System.out.println(item);
          }
      }
    }
    
  • 注意事项
    • 不可直接在循环中调用 list.remove()list.add(),否则会抛出 ConcurrentModificationException

2. 普通 for 循环

  • 特点
    • 可以通过索引访问元素。
    • 适合需要索引操作的场景,例如根据索引删除或替换元素。
  • 示例
    import java.util.ArrayList;
    import java.util.List;
    
    public class ForLoop {
      public static void main(String[] args) {
          List<String> list = new ArrayList<>();
          list.add("A");
          list.add("B");
          list.add("C");
    
          for (int i = 0; i < list.size(); i++) {
              System.out.println("Index " + i + ": " + list.get(i));
          }
      }
    }
    
  • 注意事项
    • 删除或添加元素时需要调整索引或使用反向遍历,避免跳过元素或引发异常。

3. Iterator 遍历

  • 特点
    • 提供 hasNext()next() 方法遍历集合。
    • 可通过 Iteratorremove() 方法安全地删除元素。
  • 示例
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class IteratorTraversal {
      public static void main(String[] args) {
          List<String> list = new ArrayList<>();
          list.add("A");
          list.add("B");
          list.add("C");
    
          Iterator<String> iterator = list.iterator();
          while (iterator.hasNext()) {
              String item = iterator.next();
              System.out.println(item);
          }
      }
    }
    
  • 安全删除示例
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
      String item = iterator.next();
      if ("B".equals(item)) {
          iterator.remove(); // 正确删除,不会抛出异常
      }
    }
    
  • 注意事项
    • 不要在迭代过程中直接使用 list.remove(),否则会抛出 ConcurrentModificationException

4. ListIterator 遍历

  • 特点
    • Iterator 的扩展,用于双向遍历 List
    • 提供方法:
    • hasPrevious()previous():支持反向遍历。
    • add(E e)set(E e):支持插入和替换元素。
  • 示例
    import java.util.ArrayList;
    import java.util.List;
    import java.util.ListIterator;
    
    public class ListIteratorTraversal {
      public static void main(String[] args) {
          List<String> list = new ArrayList<>();
          list.add("A");
          list.add("B");
          list.add("C");
    
          ListIterator<String> listIterator = list.listIterator();
          // 正向遍历
          while (listIterator.hasNext()) {
              System.out.println("Next: " + listIterator.next());
          }
          // 反向遍历
          while (listIterator.hasPrevious()) {
              System.out.println("Previous: " + listIterator.previous());
          }
      }
    }
    

5. 使用 Stream API(Java 8+)

  • 特点
    • 支持声明式编程,代码简洁。
    • 可以结合 filter()map()forEach() 等方法实现复杂操作。
    • 适合需要对集合进行流式处理的场景。
  • 示例
    import java.util.ArrayList;
    import java.util.List;
    
    public class StreamAPITraversal {
      public static void main(String[] args) {
          List<String> list = new ArrayList<>();
          list.add("A");
          list.add("B");
          list.add("C");
    
          list.stream().forEach(System.out::println);
      }
    }
    
  • 带条件的遍历
    list.stream()
      .filter(item -> !"B".equals(item)) // 过滤掉 "B"
      .forEach(System.out::println);
    

6. 使用 forEach 方法(Java 8+)

  • 特点
    • List 集合继承了 Iterable 接口,因此支持 forEach 方法。
    • Stream 类似,但语法更简单,直接遍历每个元素。
  • 示例
    import java.util.ArrayList;
    import java.util.List;
    
    public class ForEachMethodTraversal {
      public static void main(String[] args) {
          List<String> list = new ArrayList<>();
          list.add("A");
          list.add("B");
          list.add("C");
    
          list.forEach(item -> System.out.println(item));
      }
    }
    
  • 结合方法引用
    list.forEach(System.out::println);
    

各遍历方式的对比

方式 特点 适用场景
增强型 for 循环 简洁易用,不需要手动管理索引。 仅需要读取元素时使用。
普通 for 循环 支持按索引访问,可以灵活操作索引。 需要索引操作,或可能删除/替换元素。
Iterator 遍历 支持安全删除元素,避免并发修改异常。 需要删除元素时,推荐使用。
ListIterator 遍历 支持双向遍历,同时支持添加或修改元素。 需要双向遍历或插入/替换元素时使用。
Stream API 声明式编程,支持复杂的流式操作,如过滤、映射、排序等。 需要流式处理集合时使用。
forEach 方法 简洁的遍历方式,适合直接操作每个元素。 简单的逐一操作或结合方法引用时使用。

总结

List 集合的常见遍历方式有多种,选择合适的方式取决于具体需求:

  • 仅遍历:增强型 for 循环或 forEach 方法更简单。
  • 需要索引:使用普通 for 循环。
  • 安全删除:优先使用 Iteratorremove()
  • 双向遍历:使用 ListIterator
  • 复杂操作:推荐使用 Stream API。

发表评论

后才能评论