返回

迭代器真的有那么简单吗?举个例子来了解下!

见解分享

迭代器,顾名思义,就是一种用于遍历数据集合的对象,它提供了一种简单而有效的方法来访问集合中的每个元素。迭代器在编程中非常常见,比如在Java、C#和Python等语言中都有实现。

迭代器的 hasNext() 方法和 next() 方法

迭代器主要有 hasNext()next() 两个方法。hasNext() 方法用于检查集合中是否有下一个元素,如果存在则返回 true,否则返回 false。next() 方法用于获取集合中的下一个元素,如果不存在下一个元素,则会抛出异常。

以下示例代码展示了如何在 Java 中使用迭代器来遍历集合:

List<String> names = new ArrayList<>();
names.add("John");
names.add("Mary");
names.add("Bob");

Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
    String name = iterator.next();
    System.out.println(name);
}

这段代码首先创建了一个字符串集合,然后使用 iterator() 方法获取集合的迭代器。然后,使用 while 循环来遍历迭代器,并在每次迭代中使用 next() 方法获取集合中的下一个元素。最后,将获取到的元素打印到控制台上。

迭代器中的删除行为

迭代器中有一个需要注意的问题,那就是 删除行为 。迭代器不允许在迭代过程中对集合进行删除操作,否则会报出错误。这是因为迭代器在遍历集合时会维护一个内部指针,指向当前正在访问的元素。如果在迭代过程中删除了元素,那么迭代器的指针就会指向一个不存在的元素,从而导致错误。

以下示例代码展示了在迭代过程中删除元素会导致错误:

List<String> names = new ArrayList<>();
names.add("John");
names.add("Mary");
names.add("Bob");

Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
    String name = iterator.next();
    if (name.equals("Mary")) {
        names.remove(name);
    }
}

这段代码和前面的代码类似,只是在迭代过程中添加了一个条件判断,如果当前元素是 "Mary",则将其从集合中删除。当代码运行时,会在删除 "Mary" 元素时抛出 ConcurrentModificationException 异常。

正确的删除方式

如果需要在迭代过程中删除元素,可以使用以下两种方法:

  • 使用迭代器自己的 remove() 方法: 迭代器提供了 remove() 方法,可以安全地从集合中删除元素。以下示例代码展示了如何使用 remove() 方法来删除元素:
List<String> names = new ArrayList<>();
names.add("John");
names.add("Mary");
names.add("Bob");

Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
    String name = iterator.next();
    if (name.equals("Mary")) {
        iterator.remove();
    }
}
  • 使用显式迭代器: 也可以使用显式迭代器来遍历集合,并在迭代过程中删除元素。以下示例代码展示了如何使用显式迭代器来删除元素:
List<String> names = new ArrayList<>();
names.add("John");
names.add("Mary");
names.add("Bob");

for (int i = 0; i < names.size(); i++) {
    String name = names.get(i);
    if (name.equals("Mary")) {
        names.remove(i);
        i--;
    }
}

这两种方法都可以安全地从集合中删除元素,而不会抛出异常。