Java for Schleife performance unterschiede

meckiebro

Mitglied
Hallo zusammen normal nutze ich mehrere Varianten bei for schleifen und mich würde mal interessieren was da eigentlich optimaler ist von der Geschwindigkeit oder ob das wurst ist.

Es geht eigentlich immer darum eine Liste etc. zu durchlaufen.
Ich schreibe mal nur den Kopf hin

Code:
ArrayList<Integer> list;

V1.
Code:
for(int i = 0; i < list.size(); i++)

V2.
Code:
for(int elem : list)

V3.
Code:
for(Iterator<Integer> it = list.iterator(); it.hasNext();)

Mehr fällt mir jetzt nicht ein.

Liebe Grüße
Meckie
 
Wow Tatsache das überrascht mich ein wenig. Dachte gerade dieses list.get(i) ist nicht so gut. Aber ok. Ja dann.
Wobei ich glaube aber das dann die Remove Methode über den Iterator schneller und sicherer war. Irgendwas war da. Ist alles schon so lange her. Naja.

Dank dir
 
Hoffe du hast auch das Pardoxon der deprecated HashTable gesehen,
das hat mich mehr überrascht, dass deprecated Klassen schneller sind als die neuen.

Bei den anderen irgendwie ein bissel klar,
Iterator muss erzeugt werden, hasnext ist 'ne boolean abfrage....

size() ist eine Klassenvariable, die einfach nur abgefragt wird.
 
Hallo.

Jede Liste hat ihre Stärken und ihre Schwächen. Beim normalen durchiterieren ist die LinkedList am schnellsten. Wenn du aber immer an bestimmte Punke in der Liste springen musst, also bestimmte Positionen der Liste möchtest, ist die ArrayList schneller.

Gruß

Sascha
 
du musst das schon richtig lesen
+ = besser
- = schlechter

LinkedList ist besser als Vector und schlechter als Arraylist bei weniger Einträgen
Arraylist ist besser als Vector und LinkedList bei mehr Einträgen
 
Es kommt auch stark darauf an, was du mit der Liste/Map oder was auch immer machen willst. Willst du bestimmte Positionen aus einer Liste löschen ist die LinkedList vlt die Qual der Wahl. Aber vielleicht passiert das nur in einem vernachlässigbarem Ausnahmefall, dann kann wieder eine andere Implementierung interessant werden.

Zu Topic:
V2 und V3 sind beim Eclipse-Compiler identisch(afaik). Foreach benutzt bei ArrayList der Iterator.

Zu:
for(int i = 0; i < list.size(); i++)

Im For each von Arrays wird die Größe als Laufvariable gespeichert, damit hier noch ein paar Nanosekunden gespart werden.
 
Zuletzt bearbeitet:
In diesem Zusammenhang noch mal eine Warnung vor der Index-Variante im Zusammenspiel mit LinkedList:

Um das i-te Element einer verketteten Liste zu bekommen, muss vom Head-Element ausgehend i-mal die next-Methode aufgerufen werden. In einer LinkedList ist die Zugriffszeit auf einen bestimmten Index also keineswegs konstant, sondern kann - abhängig vom betrachteten Index - sehr groß werden.

Und das führt dann bei Iterationen a la

Java:
List<MyClass> list = new LinkedList<MyClass>();
...
for (int i=0;i<list.size();i++) {
bearbeite( list.get(i) );
...
}
zu Laufzeiten jenseits von Gut und Böse, wenn die Liste groß wird
 
Soweit ich mich erinnern kann ist die Komplexität bei allen O(n). Aber wenn man sich das detailierter anguckt, sieht man das die eine version in kleineren Bereichen schneller ist und die anderen in höheren Zahlenbereichen. Könnte man ja mal ausrechnen
 
Zurück