【问题标题】:Why does this java iterator loop print also the first element?为什么这个 java 迭代器循环也打印第一个元素?
【发布时间】:2023-03-27 17:09:01
【问题描述】:
import java.util.*;
public class IteratorDemo {

   public static void main(String args[]) {
      // Create an array list
      ArrayList al = new ArrayList();

      // add elements to the array list
      al.add("C");
      al.add("A");
      al.add("E");
      al.add("B");
      al.add("D");
      al.add("F");

      // Use iterator to display contents of al
      System.out.print("Original contents of al: ");
      Iterator itr = al.iterator();

      while(itr.hasNext()) {
         Object element = itr.next();
         System.out.print(element + " ");
      }
      System.out.println();
    }
  }

我不明白。如果al.iterator() 返回al 的第一个元素,为什么我将itr.next()(我猜应该是第二个)放入element 然后打印element 是否打印第一个元素而不是第二个?

我是 Java 新手。与 c/c++ 并行,Iterator 是否像指针,而 Iterator.next() 是否像取消引用的指针?当我执行代码中的操作时,有人可以向我解释在低级别实际发生的情况吗?

【问题讨论】:

  • "如果 al.iterator() 返回 al 的第一个元素" ...你为什么这么认为?这应该是什么逻辑?为什么第一个元素的类型应该是Iterator

标签: java arraylist iterator


【解决方案1】:

调用iterator() 返回列表中元素的迭代器,而不是第一个元素。事实上,如果这返回了第一个元素,那么条件 while(itr.hasNext()) 就没有任何意义。

只有当您调用next() 时才会返回迭代中的下一个元素。

所以,如果你想排除第一个元素,那么你需要这样做:

 if(itr.hasNext()) itr.next();

在循环之前。

另外,顺便说一句,我建议您使用参数化类型而不是原始类型,即您的 ArrayList 应声明为 ArrayList<String> al = new ArrayList<>();,而您的迭代器应声明为 Iterator<String> itr = al.iterator();

鉴于在这种情况下您要做的就是将元素打印到控制台,因此根本不需要使用迭代器,因为它更简单:

 al.forEach(element -> System.out.print(element + " "));

【讨论】:

    【解决方案2】:

    al.iterator() 不返回 al 的第一个元素。

    你可以想象这张图中的迭代器。方法 iterator() 提供了一个迭代器,以便您可以遍历列表的元素。当您调用它时,它不会给出第一个元素。每次调用 next() 方法时,它都会抓取下一个元素。这就是为什么当您第一次调用 next() 时,它会为您提供第一个元素。

    【讨论】:

      【解决方案3】:

      al.iterator() (javadoc) 返回一个迭代器到集合(在这种情况下是你的 ArrayList)而不是第一个元素。然后,您使用迭代器迭代集合的元素(使用 hasNextnext

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-18
        • 2020-09-01
        • 2017-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多