Java:迭代集合的最佳方式(此处为ArrayList)

Jas*_*ers 94 java collections for-loop

今天,当我得到一段已经使用过数百次的代码时,我很乐意编写代码:

迭代集合(这里是ArrayList)

出于某种原因,我实际上看了Eclipse的自动完成选项,它让我想知道:

以下循环比其他循环更好用?

经典数组索引循环:

for (int i = 0; i < collection.length; i++) {
  type array_element = collection.get(index);
}
Run Code Online (Sandbox Code Playgroud)

Iterator hasNext()/ next():

for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
  type type = (type) iterator.next();   
}
Run Code Online (Sandbox Code Playgroud)

我最喜欢的,因为它写得如此简单:

for (iterable_type iterable_element : collection) {

}
Run Code Online (Sandbox Code Playgroud)

MAK*_*MAK 101

当你需要元素的索引时,第一个是有用的.这基本上等同于ArrayLists 的其他两个变体,但如果使用的话,它会非常慢LinkedList.

当您不需要元素的索引但在迭代时可能需要删除元素时,第二个是有用的.但这样做的缺点是IMO有点过于冗长.

第三个版本也是我的首选.它很简短,适用于您不需要任何索引或底层迭代器的所有情况(即您只访问元素,不删除它们或Collection以任何方式修改它们- 这是最常见的情况).

  • +1打败我吧.会提到LinkedList(不是**所有**`Collection`的索引都很便宜). (3认同)

Sur*_*ran 36

所有这些都有自己的用途:

  1. 如果你有一个iterable并且需要无条件地遍历所有这些:

    for(iterable_type iterable_element:collection)

  2. 如果你有一个可迭代但需要有条件地遍历:

    for(Iterator iterator = collection.iterator(); iterator.hasNext();)

  3. 如果数据结构不实现iterable:

    for(int i = 0; i <collection.length; i ++)


snr*_*snr 11

Java 8还有另外的集合'stream()util

collection.forEach((temp) -> {
            System.out.println(temp);
});
Run Code Online (Sandbox Code Playgroud)

要么

collection.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

有关Java 8流和关于wonderers 链接的集合的更多信息