2016-05-10 10 views
5

Mein Code alsFehler beim java foreach-Anweisungen

folgt
public class Test { 

    public static void main(String[] args) { 
     int count1 = 0, count2 = 0; 
     Test[] test1 = new Test[5]; 
     Test[] test2 = new Test[5]; 
     if (test1 == null || test2 == null) 
      System.out.println("null"); 
     for (int j = 0; j < 3; j++) { 
      for (int i = 0; i < test1.length; i++) { 
       if (test1[i] == null) { 
        test1[i] = new Test(); 
        count1++; 
       } 
      } 
     } 
     for (int j = 0; j < 3; j++) { 
      for (Test test : test2) { 
       if (test == null) { 
        test = new Test(); 
        count2++; 
       } 
      } 
     } 
     System.out.println(count1 + " " + count2); 
    } 
} 

ich das Programm laufen und ich fand seine Ausgabe 5 15 ist. Es hat mich verwirrt, ich kann nicht verstehen, welche Unterschiede zwischen der Verwendung von Aussagen und der Verwendung von Foreach-Anweisungen. Danke, dass Sie mir eine Hand geben.

Antwort

11

Änderungen an der Iterationsvariablen in einer enhanced-for-Anweisung wirken sich nicht auf die zugrunde liegende Auflistung aus, sondern auf und nicht auf. So, während diese das Array modifiziert:

test[i] = new Test(); // In for loop 

... dies nicht:

test = new Test(); // In enhanced for loop 

Da das Array nicht geändert wird, das nächste Mal über sie iterieren, die Werte sind noch null, so erhöhen Sie Ihren Zähler noch 5 Mal. Zum dritten Mal iterieren Sie über das Array.

Die Moral der Geschichte ist: Verwenden Sie keine erweiterte for-Schleife, wenn Sie den Inhalt der Sammlung/Array ändern möchten.

Beachten Sie, dass Änderungen an Objekten, deren Referenzen bereits in der Auflistung/dem Array gespeichert sind, nicht als Änderung der Auflistung/des Arrays gelten. Wenn Sie also bereits die Sammlung bevölkert und einige setName() Methode hatte, dann das:

for (int i = 0; i < test1.length; i++) { 
    test[i].setName("foo"); 
} 

wäre gleichbedeutend mit:

for (Test test : test1) { 
    test.setName("foo"); 
} 

Das ist nicht das Array zu ändern, die nur Verweise auf Objekte enthält - Stattdessen werden die Daten in diesen Objekten geändert.

3

Sie können die zugrunde liegende Datenstruktur nicht mit der erweiterten For-Schleife ("foreach") ändern, Ihre test = new Test(); ändert das Array nicht.

Verwandte Themen