在Java编程的广阔天地中,迭代就像是开启宝藏箱的钥匙,而Iterator与Enhanced for loop(增强型for循环)则是这把钥匙的两种形态,它们各有千秋,引领我们探索数据结构的奥秘。今天,我们将深入剖析这两种迭代技术,从理论到实践,从基础到进阶,带你领略迭代的魅力。

Iterator:传统智慧的传承

Iterator接口是Java集合框架的核心组件之一,它允许我们在不暴露集合底层实现的情况下遍历集合中的元素。其设计遵循了迭代器模式,为集合提供了一个标准的访问机制。

示例代码

import java.util.ArrayList;
import java.util.Iterator;

public class IteratorExample {
    public static void main(String[] args) {
        ArrayList<String> names = new ArrayList<>();
        names.add("Ada Lovelace");
        names.add("Alan Turing");
        names.add("Grace Hopper");

        Iterator<String> iterator = names.iterator();
        while (iterator.hasNext()) {
            String name = iterator.next();
            System.out.println("Hello, " + name);
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

扩展讨论:除了基本的遍历功能,Iterator还提供了remove()方法,允许在迭代过程中删除元素,这对于动态集合操作非常有用。但是,需要注意的是,如果在迭代过程中尝试添加元素,则会导致UnsupportedOperationException

Enhanced for loop:现代的迭代美学

Enhanced for loop,或者称为for-each循环,是Java 5引入的一种更简洁的迭代方式。它不仅简化了代码,还提高了程序的可读性和安全性,因为编译器会自动处理迭代过程中的细节。

示例代码

import java.util.List;
import java.util.Arrays;

public class EnhancedForLoopExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Ada Lovelace", "Alan Turing", "Grace Hopper");

        for (String name : names) {
            System.out.println("Hello, " + name);
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

扩展讨论:Enhanced for loop在遍历时不能直接修改正在迭代的集合,否则会抛出ConcurrentModificationException。如果需要在遍历的同时修改集合,应考虑使用Iterator或其他方法。

进阶篇:Iterator与Enhanced for loop的协同作战

在实际开发中,我们可能会遇到需要同时使用Iterator和Enhanced for loop的情况,例如,在一个循环中读取集合,而在另一个循环中修改集合。

示例代码

import java.util.ArrayList;
import java.util.List;

public class CombinedUsageExample {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            numbers.add(i);
        }

        // Reading using enhanced for loop
        for (Integer number : numbers) {
            System.out.print(number + " ");
        }
        System.out.println();

        // Modifying using Iterator
        Iterator<Integer> iterator = numbers.iterator();
        while (iterator.hasNext()) {
            Integer number = iterator.next();
            if (number % 2 == 0) {
                iterator.remove();
            }
        }

        // Showing the modified list
        for (Integer number : numbers) {
            System.out.print(number + " ");
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.

输出

0 1 2 3 4 5 6 7 8 9 
1 3 5 7 9 
  • 1.
  • 2.
性能考量与最佳实践

尽管Enhanced for loop在多数情况下更为便捷,但在性能敏感的应用中,Iterator可能更具优势,因为它提供了更多的控制,特别是在处理大型数据集时。此外,使用Iterator的remove()方法在遍历过程中删除元素,可以避免创建额外的集合副本。