java - 迭代链表

tom*_*mes 20 java linked-list

如果我在Java中使用for-each循环链表上,是保证我会重复关于它们出现在列表中的顺序的元素?

Ghe*_*ham 47

我找到了5种主要方法来迭代Java中的链表(包括Java 8方式):

  1. 对于循环
  2. 增强的For循环
  3. 而Loop
  4. 迭代器
  5. Collections的stream()util(Java8)

对于循环

LinkedList<String> linkedList = new LinkedList<>();
System.out.println("==> For Loop Example.");
for (int i = 0; i < linkedList.size(); i++) {
    System.out.println(linkedList.get(i));
}
Run Code Online (Sandbox Code Playgroud)

增强了循环

for (String temp : linkedList) {
    System.out.println(temp);
}
Run Code Online (Sandbox Code Playgroud)

循环

int i = 0;
while (i < linkedList.size()) {
    System.out.println(linkedList.get(i));
    i++;
}
Run Code Online (Sandbox Code Playgroud)

迭代器

Iterator<String> iterator = linkedList.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next()); 
}
Run Code Online (Sandbox Code Playgroud)

集合流()util(Java 8)

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

有一点需要指出的是For LoopWhile循环的运行时间是O(n平方),因为get(i)操作需要O(n)时间(详情请参阅此内容).其他3种方式需要线性时间并且表现更好.

  • 线性时间和 O(n) 是相同的,不是吗? (2认同)

Dav*_*e G 13

保证链接列表按顺序执行.

文档中

有序集合(也称为序列).该接口的用户可以精确控制列表中每个元素的插入位置.用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素.

iterator() 以适当的顺序返回此列表中元素的迭代器.


小智 7

正如Linkedlist的定义所说,它是一个序列,您可以保证按顺序获取元素.

例如:

import java.util.LinkedList;

public class ForEachDemonstrater {
  public static void main(String args[]) {
    LinkedList<Character> pl = new LinkedList<Character>();
    pl.add('j');
    pl.add('a');
    pl.add('v');
    pl.add('a');
    for (char s : pl)
      System.out.print(s+"->");
  }
}
Run Code Online (Sandbox Code Playgroud)


Cal*_*ary 5

链表确实保证顺序。

不要使用linkedList.get(i),尤其是在顺序循环中,因为它违背了拥有链表的目的,并且代码效率低下。

使用列表迭代器

    ListIterator<Object> iterator = myLinkedList.listIterator();
    while( iterator.hasNext()) {
        System.out.println(iterator.next());
    }
Run Code Online (Sandbox Code Playgroud)