javaのリンクリストでfor-eachループを使用する場合、リストに表示される順序で要素を繰り返すことが保証されますか?
リンクリストは、順番どおりに動作することが保証されています。
ドキュメント から
順序付けられたコレクション(シーケンスとも呼ばれます)。このインターフェイスのユーザーは、リストの各要素を挿入する場所を正確に制御できます。ユーザーは、整数インデックス(リスト内の位置)で要素にアクセスし、リスト内の要素を検索できます。
iterator() このリスト内の要素を適切な順序で繰り返し処理する反復子を返します。
Java(Java 8ウェイを含む)でリンクリストを反復処理する5つの主な方法を見つけました。
Forループ
_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));
}
_
拡張forループ
_for (String temp : linkedList) {
System.out.println(temp);
}
_
ループ中
_int i = 0;
while (i < linkedList.size()) {
System.out.println(linkedList.get(i));
i++;
}
_
イテレータ
_Iterator<String> iterator = linkedList.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
_
collection stream()util(Java 8)
_linkedList.forEach((temp) -> {
System.out.println(temp);
});
_
注目すべき点の1つは、For LoopまたはWhile Loopの実行時間がget(i)
操作は、O(n) time( 詳細はこちらを参照 ))を取ります。他の3つの方法は、線形時間を取り、パフォーマンスが向上します。
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+"->");
}
}
リンクリストは、順序を保証します。
使用しないでください linkedList.get(i)、特にシーケンシャルループ内では、リンクされたリストを持つという目的を無効にし、非効率的なコードになるためです。
使用する ListIterator
ListIterator<Object> iterator = myLinkedList.listIterator();
while( iterator.hasNext()) {
System.out.println(iterator.next());
}
各Java.util.Listの実装は順序を保持するために必要であるため、ArrayList、LinkedList、Vectorなどを使用している場合、それぞれが順序付けられたコレクションであり、それぞれが挿入の順序を保持します( http:/ /download.Oracle.com/javase/1.4.2/docs/api/Java/util/List.html )