3

我见过这样的代码:

List<String> listOfStrings = new ArrayList<>();
listOfStrings.add("A");
listOfStrings.add("B");

for(String txt: listOfStrings) {
 System.out.println(txt);
}

我没有看到 ArrayList 的内部代码或其接口,因为我不需要附加 jar 以便我可以看到源代码。

谁能解释这怎么可能?

好吧好吧。我更新了问题....我想澄清一下:我可以创建自己的数据结构,然后通过一些特殊的内部代码,用户也可以在我自己的数据结构上使用每个循环

4

9 回答 9

2

这个 for 子句这样做:

for(T item: Iterable<T>)

第一部分(T item)用于属于任何实现的类的元素Iterable(第二部分))

它实际上不是一个ArrayList特性,但你可以在任何Iterable类中做到这一点。

于 2013-07-29T04:36:50.163 回答
2

因为在内部它被转换为集合的迭代器。

这个 for-each 循环,

for (type var : coll) {
    body-of-loop
}

将转换为以下形式:

for (Iterator<type> iter = coll.iterator(); iter.hasNext(); ) {
    type var = iter.next();
    body-of-loop
} 
于 2013-07-29T04:37:45.987 回答
1

对于每个循环都使用一个implicit iteratoroveriterable集合。它更具可读性和更清晰。只要您不想重组(删除或交换元素)集合,它就是一个不错的选择。

于 2013-07-29T04:36:26.950 回答
1

他们在 Java 5 中添加了这个。它被称为for-each 循环。它是使用迭代器循环遍历集合的简写。

于 2013-07-29T04:36:27.367 回答
1

之所以有效,是因为 ArrayList实现了可迭代

于 2013-07-29T04:36:41.437 回答
1

这是一个for-each循环。

您的代码的另一种表示如下。它可以帮助您理解

for(int i = 0; i < listOfStrings.size(); i++) {
 System.out.println(listofStrings.get(i));
}
于 2013-07-29T04:38:04.913 回答
0

每个循环在内部转换为

for(Iterator<String> i = listOfStrings.iterator(); 
                                                  i.hasNext(); ) {
  String txt = i.next();
  System.out.println(txt);
}
于 2013-07-29T04:42:41.843 回答
0

根据Docs的增强 for 语句相当于编译后的基本 for 语句
示例:

 List<? extends Integer> l = ...
 for (float i : l){
  }

编译后转换成这种形式

 for (Iterator<Integer> #i = l.iterator(); #i.hasNext(); ) {
     float #i0 = (Integer)#i.next();
 }
于 2013-07-29T04:47:17.347 回答
0

它适用于每个循环,即(增强的 for 循环)

for(T item: Iterable<T>)

内部使用

for(int i = 0; i < listOfStrings.size(); i++) {
 System.out.println(listofStrings.get(i));
}

这最适合集合和数组(实现 Iterable 接口),缺点是您不能以相反的顺序打印。

于 2013-07-29T04:47:22.103 回答