猿问

在Java中迭代列表的方法

在Java中迭代列表的方法

作为Java语言的新手,我试图熟悉所有可能迭代列表(或者可能是其他集合)的方法(或者至少是非病态的方法),以及每种方法的优缺点。

给出List<E> list对象,我知道以下遍历所有元素的方法:

基本 环路(当然,有等价物while / do while循环)

// Not recommended (see below)!for (int i = 0; i < list.size(); i++) {
    E element = list.get(i);
    // 1 - can call methods of element
    // 2 - can use 'i' to make index-based calls to methods of list

    // ...}

注意:正如@amarseillan所指出的,这个表单是迭代的一个糟糕的选择。ListS的实际实现,因为get方法的效率可能不如使用Iterator..例如,LinkedList实现必须遍历I之前的所有元素以获得第一个元素.

在上面的例子中,List实现来“保存它的位置”,以使将来的迭代更有效率。为了ArrayList这并不重要,因为get是常数时间(O(1),而对于LinkedList它是否与列表的大小成正比(O(N)。

有关内建的计算复杂性的更多信息。Collections实现,请查看这个问题.

增强型用于循环(解释得很好在这个问题上)

for (E element : list) {
    // 1 - can call methods of element

    // ...}

爱尔兰人

for (Iterator<E> iter = list.iterator(); iter.hasNext(); ) {
    E element = iter.next();
    // 1 - can call methods of element
    // 2 - can use iter.remove() to remove the current element from the list

    // ...}

ListIterator

for (ListIterator<E> iter = list.listIterator(); iter.hasNext(); ) {
    E element = iter.next();
    // 1 - can call methods of element
    // 2 - can use iter.remove() to remove the current element from the list
    // 3 - can use iter.add(...) to insert a new element into the list
    //     between element and iter->next()
    // 4 - can use iter.set(...) to replace the current element

    // ...}

函数Java

list.stream().map(e -> e + 1); // Can apply a transformation function for e

Iterable.forEach为每一个人, ...

(Java 8的StreamAPI中的map方法(请参阅@i_am_零的答案)。

在Java 8集合类中实现Iterable(例如,所有List(S)现在有一个forEach方法,可以使用该方法来代替循环语句如上所示。(这里是另一个问题这提供了一个很好的比较。)

如果有的话,还有什么其他的方法吗?

(顺便说一句,我的兴趣根本不是出于对优化性能我只想知道作为一名开发人员,我可以使用哪些表单。)


呼啦一阵风
浏览 593回答 3
3回答

MMMHUHU

这三种循环形式几乎是相同的。增强for循环:for&nbsp;(E&nbsp;element&nbsp;:&nbsp;list)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;.&nbsp;.}是,根据Java语言规范,&nbsp;完全相同实际上,使用传统的迭代器可以显式地使用迭代器。for循环。在第三种情况下,只能通过移除当前元素来修改列表内容,而且只有通过remove迭代器本身的方法。使用基于索引的迭代,您可以任意修改列表。但是,添加或删除当前索引之前的元素可能会使您的循环跳过元素或多次处理相同的元素;在进行此类更改时,需要正确地调整循环索引。在所有情况下,element是对实际列表元素的引用。没有一个迭代方法会复制列表中的任何内容。的内部状态的更改。element将始终显示在列表中相应元素的内部状态。本质上,迭代列表的方法只有两种:使用索引或使用迭代器。增强型for循环只是Java 5中引入的一种语法快捷方式,以避免显式定义迭代器的繁琐。对于这两种样式,您可以使用for,&nbsp;while或do while积木,但它们都归结为同一件事情(或者说,更确切地说,是两件事)。编辑:正如@iX3在注释中指出的那样,您可以使用ListIterator若要在迭代时设置列表的当前元素,请执行以下操作。你需要用List#listIterator()而不是List#iterator()初始化循环变量(显然,必须将其声明为ListIterator而不是Iterator).

长风秋雁

不建议使用基本循环,因为您不知道列表的实现。如果这是LinkedList的话,每个电话list.get(i)将对列表进行迭代,从而导致N^2时间复杂度。
随时随地看视频慕课网APP

相关分类

Java
我要回答