2013-07-31 4 views
9

Ich habe ein Problem in meinem Code gefunden. Zuerst wird der Code:Java for Schleife nach Wert oder per Referenz

public class Main { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     String[] blablubb = { "a", "b", "c" }; 

     for(String s : blablubb) { 
      s = "over"; 
     } 
     printArray(blablubb); 


     for (int i = 0; i < blablubb.length; i++) { 
      blablubb[i] = "over"; 
     } 
     printArray(blablubb); 

    } 

    public static void printArray(String[] arr) { 
     for(String s : arr) { 
      System.out.println(s); 
     } 
    } 

} 

Der Ausgang ist:

a 
b 
c 
over 
over 
over 

nahm ich die erste Schleife auch die Zeichenfolge in dem Array überschreiben würde. Also wäre die Ausgabe in jedem Fall vorbei. Es scheint, dass es eine Kopie des Werts erstellt, anstatt eine Referenz zu erstellen. Ich habe das nie wahrgenommen. Mache ich es falsch? Gibt es eine Option, stattdessen eine Referenz zu erstellen?

// Edit: Scheint, wie jeder darüber außer mir weiß. Ich bin von C Hintergrund und nicht genügend Aufmerksamkeit auf die Bezeichnung Bezug, die sehr unterschiedlich ist C. Glücklicherweise brauchte ich nur 10 Minuten, um dies herauszufinden (dieses Mal).

+3

http : //stackoverflow.com/questions/40480/is-java-pass-by-reference – assylias

Antwort

16

Dieses:

for (String s : blablubb) { 
    s = "over"; 
} 

gleich dies:

for (int i = 0; i < blablubb.length; i++) { 
    String s = blablubb[i]; 
    s = "over"; 
} 

Dies erzeugt eine temporäre String mit einer Kopie des Wertes von Array und Sie ändern nur die Kopie. Deshalb bleibt blablubb[] Inhalt unberührt.

Wenn Sie Werte ändern im Array wollen, nur Ihre zweite Option:

for (int i = 0; i < blablubb.length; i++) {   
    blablubb[i] = "over"; 
} 

Und, nebenbei bemerkt, können Sie ein Array mit nur einer Zeile drucken:

System.out.println(Arrays.toString(blablubb)); 
1

Die for-each-Schleife ändert nicht die Objekte in der Objektgruppe, über die sie iteriert. Es übergibt den Wert, nicht die Referenz.

0
s = "over"; 

ändert nur die Referenz von s und nicht die Zeichenfolge im Array.

blablubb[i] = "over"; 

ändert den Wert am i-ten Stelle im

Array gespeichert
4

Ihre for(String s : blablubb) Schleife wie dem folgenden Code entspricht:

for(int i = 0; i < blablubb.length; i++) { 
    String s = blablubb[i]; 
    s = "over"; 
} 

Hoffentlich davon, können Sie sehen, dass alles, was Sie tun weist s einen anderen Wert zu, ohne blablubb[i] zu ändern. Dies erklärt die Ausgabe, die Sie sehen.

0
for(String s : StringArray) 
{ 
} 

wie

ist
for(int i = 0; i < StringArray.length; i++) 
{ 
    String s = StringArray[i]; 
} 
0

Wenn Sie möchten, eine geringe Optimierung tun, wissen, wie Sie in Java-Code aussehen müssen und innerhalb Byte-Code entweder (kompilierten Code)

for(String s : blablubb) { 
      s = "over"; 
} 

ist gleich mit:

for (int i = 0; i < blablubb.length; i++) { 
    String s = blablubb[i];    
    s = "over"; 
} 

und deshalb ist die Ausgabe so wie sie ist.