For-Each Loop Alternative - 澄清

时间:2015-06-12 20:30:30

标签: java loops foreach iterator

我正在学习Java课程,并且无法完全理解下一课中的内容。

目的:本课程的目的是通过创建一个模拟for-each循环如何工作的替代方案来解释for-each循环的工作原理。

在上一课中,for-each循环的解释很简单:

import java.util.ArrayList //Imports ArrayList CLASS

public class ForEachLoops

{

    public static void main(String[] args)
    {

        ArrayList<Integer> numbers = new ArrayList<Integer>(); 
        // ^ Creates ArrayList object & calls constructor
        for(int i = 1; i < 11; ++i)
            numbers.add(i); //Just adding numbers 1-10 to the ArrayList.


        for(int n : numbers) //For-Each Loop
            System.out.println(n); //Returns value from each ArrayList element


    }

}

在下一课中,讲师将展示如何创建for-each循环的替代/模拟器。它的工作原理如下:

import java.util.ArrayList; //Importing ArrayList class from package
import java.util.Iterator; // Question 1 (See Below)

public class Chap16Part9
{

    public static void main(String[] args)
    {

        ArrayList<Integer> numbers = new ArrayList<Integer>();
        // ^ Creating object of ArrayList & calling constructor

        for(int i = 1; i < 11; ++i)
            numbers.add(i); //Just adding numbers 1-10 to ArrayList object

        for(Iterator<Integer> n = numbers.iterator(); n.hasNext();) {
   //       ^ Question 2 (See Below)
            int num = n.next(); //Points to the next element to assign value.
            System.out.println(num); //Prints current value of "num."
        }

    }

}

问题1 :阅读Java文档后,&#34; Iterator&#34;被列为接口。这仍然与导入类相同吗?例如,在Java文档中,&#34; java.util.Scanner&#34;被认为是一个类,而不是一个接口。

问题2 :在提出问题之前,循环不需要&#34; ++ i&#34;实现的控件类型,因为Iterator的hasNext()方法检查是否有另一个要检查的元素。如果没有,那就停止。它是一个布尔值。然而,循环的开始,循环控制变量(LCV)是&#34; Iterator<Integer> n = numbers.iterator();&#34;我不太明白这是什么意思。在我看来,我看到了Iterator类的一个对象?被设置为等于ArrayList iterator()方法。可能是因为#34; java.util.Interator;&#34;被认为是一个接口(基本上是一个声明了必须在类实现时实现的方法的契约),ArrayList类完成了ArrayList类中声明的iterator()方法的语句集,因此需要因为传统的类被调用(例如,ArrayList),而不是由构造函数调用?我对此感到有些困惑,我希望有人能够对此有所了解。谢谢!

2 个答案:

答案 0 :(得分:2)

Java引用类型包括类,接口和枚举(以及数组,但它们有点不同)。所有这些都是定义行为的代码片段,因此需要为您的程序导入以了解其中可用的方法等。

因此,诸如Iterator之类的接口具有代码,该代码指出在其中定义了哪些方法和常量,方法接受哪些参数,返回哪些类型等等。编译器必须知道能够检查程序正确性的所有内容,并在它创建的字节代码中生成对这些方法的正确调用。

iterator()中的方法List返回该列表中项目的迭代器。也就是说,来自实现Iterator的类的对象。你不知道将会是哪个类以及它是如何实现的 - 这些信息被封装在特定列表的代码中 - 但是你知道它实现了Iterator因此在Iterator中声明了所有方法并根据Iterator合同实施它们。

因此,您可以将对实现接口 X 的任何对象的引用分配给类型为 X 的变量,即使它只是一种界面类型。该变量指向某个类中的实际对象,但该程序仅对它实现 X 这一事实感兴趣。

Iterator<Integer> n = numbers.iterator();

正是这样。它说“将n声明为接口类型Iterator<Integer>的变量。请求numbers列表中的迭代器,并将其分配给n。所以你的”循环变量“实际上是Iterator对象。因为您知道它是Iterator类型 - 实现Iterator合同 - 您知道可以在其上使用hasNext()next()这就是你在循环条件检查和下一行中所做的。

答案 1 :(得分:1)

接口类似于类,但不是构造新类,而是使用关键字implements实现接口。迭代器接口在许多Java标准类中实现。

想象一下,你有一个球厂。 它可以抽出网球和篮球,这是你的课程。但是当网球和篮球都被制造出来时,它们具有类似的属性,例如isRound()和bounce()等等。界面就像在名称下将这些属性组合在一起。所以网球和篮球都实现了Ball的界面。

因此,在实现iterable的List中,您可以使用名为iterator的可迭代方法,该方法可以遍历列表的元素。 Arraylist也可以通过继承List进行迭代。

相关问题