Array mit Schleife durchlaufen - guter Stil?

Status
Nicht offen für weitere Antworten.
G

gast

Gast
Hallo zusammen,

mich würde interessieren, welche Variante stilvoller und/oder perfomanter ist:

Code:
...
ArrayList<String> list = new ArrayList<String>();

//ArrayList wird gefüllt
...

//Variante 1:
for (int i = 0; i < list.size(); i++) {
   String x = list.get(i);
   ...
}

//Variante 2:
String x;
for (int i = 0; i < list.size(); i++) {
   x = list.get(i);
   ...
}

Also innerhalb jedes Mal neu deklarieren oder einmal ausserhalb?
Dachte mir, wenn ichs innerhalb deklariere, wird die Variable jedesmal verworfen und vom Garbage Collector eingesammelt. Wenn ichs ausserhalb deklariere, wird bei jeder neuen Zuweisung der alte Wert verworfen, also GC.
Sind als beide Varianten gleich performant?

Danke schon mal und Grüße.
 

Marco13

Top Contributor
Man weiß nicht, was der Compiler da für einen Bytecode draus macht, und noch weniger, was der Just-In-Time-Compiler dann daran noch optimiert. FALLS (!) es überhaupt einen Geschwindigkeitsunterschied gibt (was ich nicht glaube) ist der vernachlässigbar gering. Bei String ist das sogar nochmal was anderes, weil die intern nochmal in einem Pool liegen. Aber auch bei anderen Objekten dürfte es in bezug auf die Geschwindigkeit egal sein.

Das heißt, man sollte die "Schönere" Variante verwenden. Und da man (imho, bis auf seltenSTe Ausnahmen) den Gültigkeitsbereich von Variablen immer so klein wie möglich halten sollte, wäre das Variante 1.
 

Wildcard

Top Contributor
Der Compiler/HotSpot-Compiler bügelt dir solche Sachen in der Regel aus, das ist also eigentlich egal.
Dein Stil ist allerdings nicht so optimal.
1. Verwende ein Interface aus der Collection API als Variablentyp
2. Nimm eine foreach Schleife oder einen Iterator
 
G

Gast

Gast
Wieso Collection statt Array?

Wieso foreach-Schleife? Ich muss den Index auslesen und in einem global(er)en int speichern, wenn eine bestimmte Bedingung erfüllt ist. Mit foreach geht das nicht...
 

KSG9|sebastian

Top Contributor
Wir haben in der Firma mal etwas in die tiefen des Hotspotcompilers geschaut.
Mit Java 1.4 ist folgende Variante am schnellsten:

Code:
List aList = new ArrayList();

for(int i=0,j=aList.size(); i<j; i++){
 doSomething(aList.get(i));
}

bei 1.5 würde ich die foreach-Schleife empfehlen

Code:
List<String> aList = new ArrayList<String>();

for(String s : aList){
 doSomething(s);
}
 

Wildcard

Top Contributor
Gast hat gesagt.:
Wieso Collection statt Array?

Wieso foreach-Schleife? Ich muss den Index auslesen und in einem global(er)en int speichern, wenn eine bestimmte Bedingung erfüllt ist. Mit foreach geht das nicht...
Wenn du ein's der Interfaces verwendest hast du gleiche Funktionalität, bist aber flexibler weil du nicht auf eine Implemenierung festgelegt.
Die Index Sache funktioniert beispielsweise bei der ArrayList noch, hast du aber eine LinkedList fliegst du auf die Performance Nase.
Daher immer besser die foreach Schleife oder einen Iterator und einen Index mitlaufen lassen wenn man ihn denn braucht(zumindest wenn man eine Liste nicht nur lokal verwendet).

@KSG9|sebastian
Die Unterschiede halte ich für verschwindent gering, Da lohnt es kaum sich Gedanken zu machen.
 

KSG9|sebastian

Top Contributor
natürlich ist der Unterschied verschwindent gering, aber je nach Größe der Anwendung macht es schon Sinn darüber nachzudenken.
Und bei der Größe unserer Anwendung macht das teilweise einen markanten Unterschied
 
S

SlaterB

Gast
Marco13 hat gesagt.:
FALLS (!) es überhaupt einen Geschwindigkeitsunterschied gibt (was ich nicht glaube) ist der vernachlässigbar gering. Bei String ist das sogar nochmal was anderes, weil die intern nochmal in einem Pool liegen.
hier werden nur Objektreferenzen aus einer vorhandenen Liste geholt (nicht erzeugt),
da dürfte es keinen Unterschied zwischen Strings und anderen Objekten geben?
 

Ark

Top Contributor
Ich glaube, es gibt zwischen der traditionellen for-Schleife und foreach bei Arrays(!) keinen Unterschied. Ich denke auch, dass es hier ebenfalls keinen(!) Unterschied gibt:

Code:
for(int i=0;i<a.length;i++){
   Klasse x=a[i];
   x.doSomething();
}

// vs.

Klasse x;
for(int i=0;i<a.length;i++){
   x=a[i];
   x.doSomething();
}

Grund: AFAIR sind die Deklarationen nur für den Compiler interessant, aber nicht mehr zur Laufzeit, wenn es beide Male darum gehe, Speicherplatz zu reservieren.

Code:
while(true){
   int a=1;
}
Im Gegensatz zu anderen Sprachen wird der Speicher hier nicht voll. ;)

Oder habe ich jetzt etwas übersehen/falsch verstanden?

ArK
 
S

SlaterB

Gast
voll muss es nicht werden, es geht um die Zeit, den Speicherplatz zu organisieren (anfordern, verfügen, freigeben),

zumindest beim Aufruf einer Suboperation wird ja eine Menge getan..
 

KSG9|sebastian

Top Contributor
@Ark: Bei 1.4 gibt es DEFINITIV einen Unterschied. Da verwette ich mein Auto drauf. Es ist deshalb schneller weil der Hotspotcompiler sonst bei jedem Schleifendurchlauf size() auf die Collection ausführt. Und als lokale Variable wird es nur einmal aufgerufen. Und das macht einen minimalen Unterschied. Zumindest bei 1.4..

Denk mit 1.5 wurde das geändert. Da wir kein 1.5 benutzen hab ich kein Plan ob es da noch passt.
 
S

SlaterB

Gast
@KSG9|sebastian
das mit size ist klar, darüber diskutiert keiner,
die ursprüngliche Frage war ja die lokale Variable
 

Der Müde Joe

Top Contributor
@SlaterB + KSG9:

dann macht doch ne High Speed schleife

Code:
for( int i = 0, size = collection.size() ; i<size ; i++)

schon ist das size() wegoptimiert...

:bae:
 
G

Gast

Gast
Aehm wow, danke für die vielen Antworten.

Aber: mit der for each Schleife kann ich doch immernoch nicht auf den Index zugreifen. oder?
Code:
int index = -1;
for (int i = 0, int size = collection.size(); i < size; i++) {
   if (bedingung) index = i;
}
Somit finde ich den letzten Index, der meine Bedingung erfüllt. Ist es da wirklich besser eine for each Schleife zu verwenden und einen Zähler extra mitlaufen zu lassen?
Der Vorteil von foreach ist, dass eine LinkedList nicht mit index sondern mit nextElement() durchlaufen wird, habe ich das richtig verstanden?

Ich bin auch noch nicht 100% von dieser Collectione-Sache überzeugt, da ich ziemlich sicher nur ArrayLists verwende(n werde).

Gruß.
 

KSG9|sebastian

Top Contributor
eine ArrayList IST eine Collection

Der Vorteil wenn du z.B. nur ein Listinterface zurückgibst ist der, dass du die Implementierung darunter frei austauschen kannst.
Wenn du z.B. einfällt dass du statt ner ArrayList eine LinkedList brauchst kannst das einfach austauschen. Also so z.B.

Code:
public class MeinModel{
   private List<String> irgendwas = new LinkedList<String>();

   public List<String> getIrgendwas(){
      return irgendwas;
   }
}

public class Blah{
   private MeinModel model;
   public irgendwo(){
      for(String s : model.getIrgendwas()){
         tuWasMit(s);
      }
   }
}

// Wenn dir jetzt einfällt das die Linkedlist eigentlich fürn AA 
// ist, dann tausch's einfach aus. Am restlichen Code ändert sich
//nichts

//ausgetauscht:
public class MeinModel{
   private List<String> irgendwas = new ArrayList<String>();

   public List<String> getIrgendwas(){
      return irgendwas;
   }
}

Der restliche Code bleibt gleich.
Wenn du den Index willst (wozu auch immer):

Code:
int index = 0;
for(String s : model.getIrgendwas()){
  tuWasMit(s);
  tuWasMitIndex(index);
  index++;
}
 

Marcel_Handball

Bekanntes Mitglied
zu dem Unterschied der foreach Schreife und der normalen for -Schleife:

Intern setzt der Compiler diese erweiterte foreach-Schleife ganz klassisch um, sodass der Bytecode unter beiden Varianten gleich ist. Nachteile der foreach Variante sind jedoch:

* Das erweiterte for läuft immer das ganze Feld ab. Anfang- und Ende-Index lassen sich nicht ausdrücklich setzen.

* Die Ordnung ist immer von vorne nach hinten.

* Der Index ist nicht sichtbar.

* Die Schleife liefert ein Element, kann aber nicht in das Feld schreiben.

Bestehen andere Anforderungen, kann weiterhin nur eine klassische for-Schleife helfen.

www.galileocomputing.de/openbook/javainsel6/javainsel_03_009.htm#mjcdaa123ec655f6dfe574bd9db37a7ba7 :3.9.9 Die erweiterte for-Schleife
 

Leroy42

Top Contributor
Ark hat gesagt.:
Code:
while(true){
   int a=1;
}
Im Gegensatz zu anderen Sprachen wird der Speicher hier nicht voll. ;)

Welche anderen Sprachen meinst du? :shock:

Bei allen Sprachen, die Block-lokale Variablen kennen, wird der
Speicher durch die Anweisungen doch nicht voll.

Die Abarbeitung dieser Anweisung zieht sich eben nur ein Wenig hin. :cool:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
TimoN11 Array -> Schleife wieder von vorne durchlaufen lassen Java Basics - Anfänger-Themen 1
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
C 2D Array Ausgabe mit for-Schleife i,j Java Basics - Anfänger-Themen 4
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
D EinMalEins mithilfe einer for-Schleife und Array Java Basics - Anfänger-Themen 1
sgtcoopa Array übergeben Schleife Java Basics - Anfänger-Themen 0
D Array mit while-schleife Java Basics - Anfänger-Themen 12
S Mit for-Schleife ein 2D JLabel-Array mit veränderbaren Icons erstellen Java Basics - Anfänger-Themen 3
S Array mit for-Schleife besetzen Java Basics - Anfänger-Themen 7
T Methode um Array mit for-each-Schleife auszulesen Java Basics - Anfänger-Themen 7
D Doppelte For Schleife / Array Java Basics - Anfänger-Themen 3
T Variable in for Schleife ansprechen ohne Array ? Java Basics - Anfänger-Themen 25
A eine neue normale String-Array von einer String-Array, die in for schleife ist, schaffen Java Basics - Anfänger-Themen 3
I Java zweidimensionales array befüllen mit for-schleife Java Basics - Anfänger-Themen 2
M Ist es möglich, das größte und zweitgrößte element in einem Array mit nur einer Schleife ausfindig zu machen ? Java Basics - Anfänger-Themen 19
G while schleife mit array Java Basics - Anfänger-Themen 12
krgewb Erweiterte for-Schleife für 2D-Array Java Basics - Anfänger-Themen 4
B Array via Schleife mit ungeraden bzw geraden Zahlen füllen Java Basics - Anfänger-Themen 7
N Anfang eine Array Schleife finden Java Basics - Anfänger-Themen 18
N Methode mit While-Schleife und If-Bedingung und Array-Initialisierung Java Basics - Anfänger-Themen 4
V Erste Schritte Array.length[x] in einer Schleife - ich verstehe das nicht Java Basics - Anfänger-Themen 1
K Array mit for-each Schleife füllen Java Basics - Anfänger-Themen 5
W Erste Schritte füllen Attribute java Klasse in for Schleife und Array Java Basics - Anfänger-Themen 16
S For Schleife Char Array Java Basics - Anfänger-Themen 1
S int-Array mittels Arrays.sort() in einer Schleife sortieren. Java Basics - Anfänger-Themen 2
S Array mit "foreach"-Schleife und nextInt (aus Scanner) beschreiben Java Basics - Anfänger-Themen 6
J Werte der For-Schleife in Array abspeichern Java Basics - Anfänger-Themen 1
T Array in Schleife Java Basics - Anfänger-Themen 5
C For schleife mit Array und Objekten Java Basics - Anfänger-Themen 17
D Array in for-Schleife ausgeben Java Basics - Anfänger-Themen 3
J Einem String-Array in einer for-Schleife Strings zuweisen - Klappt nicht in einer for-Schleife Java Basics - Anfänger-Themen 5
R Erste Schritte 2D-Array: Zeilen & Spalten ohne schleife übergeben? Java Basics - Anfänger-Themen 3
L Falsches Array ausgegeben aufgrund von Fehler in Schleife (??) Java Basics - Anfänger-Themen 6
J For Schleife mit Array funktioniert nicht!? Java Basics - Anfänger-Themen 5
M For schleife mit Array Java Basics - Anfänger-Themen 5
N erweitere for-schleife array Java Basics - Anfänger-Themen 4
S Zweidimensionales Array mit Schleife summieren Java Basics - Anfänger-Themen 2
L String aus eingelesener XML (Schleife) in String Array ablegen Java Basics - Anfänger-Themen 13
H mit Schleife ein Array mit Objekten füllen Java Basics - Anfänger-Themen 3
B Schleife und Array Java Basics - Anfänger-Themen 18
C Schleife mit Array funktioniert nicht Java Basics - Anfänger-Themen 4
E foreach schleife nur mit int-Array ? Java Basics - Anfänger-Themen 2
G for-Schleife in zweidimensionalen Array ausgeben Java Basics - Anfänger-Themen 2
G Methodenaufruf in der for-Schleife mit Array Java Basics - Anfänger-Themen 7
J array in for-Schleife auslesen? Java Basics - Anfänger-Themen 6
G Zweidimensinales String array über for Schleife beschreiben Java Basics - Anfänger-Themen 20
M Array und Schleife Java Basics - Anfänger-Themen 2
T Array verkleinern Java Basics - Anfänger-Themen 2
J Array aus Numberfield Eingaben Java Basics - Anfänger-Themen 7
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
T array auslesen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Proxy Chars vor array übergabe toLowerUpcase Java Basics - Anfänger-Themen 14
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
S array 2 dimensional treppe Java Basics - Anfänger-Themen 3
S Array 2x2 Blöcke mit 0 und 1 Java Basics - Anfänger-Themen 10
C Array von Klassen Java Basics - Anfänger-Themen 2
julian0507 2Dim-Array Spaltensummen Java Basics - Anfänger-Themen 1
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Array.list vergleichen Java Basics - Anfänger-Themen 1
W Java-Code mit Array Java Basics - Anfänger-Themen 14
D Reflections & Generisches Array Java Basics - Anfänger-Themen 4
T Array Java Basics - Anfänger-Themen 2
T Array Java Basics - Anfänger-Themen 15
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
J Array Median bestimmen Java Basics - Anfänger-Themen 6
S Array Maximum bestimmen mit for und foreach Java Basics - Anfänger-Themen 7
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
N Array Java Basics - Anfänger-Themen 1
J Array Mittleren Wert bestimmen Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
O 2 Dimensionales Array Java Basics - Anfänger-Themen 6
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben