2013-01-10 5 views
14

Ich verstehe, dass neu für jede Schleife mit Iterable und Arrays arbeitet, aber ich weiß nicht, was hinter den Kulissen geht, wenn Sie mit Arrays arbeiten.Wie funktioniert primitive Array für jede Schleife in Java mit new?

Kann mir jemand helfen, das zu verstehen? Danke im Voraus.

+0

BTW, es wäre geholfen, wenn Sie kommentiert hatte, warum die Frage nach unten gestimmt. –

+0

upvoted, wenn es interessant zu finden, vor allem, wenn seine Entsprechung auf Byte-Code-Basis zu einer normalen (effizienten) Schleife. Aber das hat niemand genau beantwortet. – AlexWien

Antwort

3

In Ihrem Code ordnen Sie ein Array von 10 Ganzzahlen im Speicher zu und erhalten einen Verweis darauf. In der for-Schleife iteriert man einfach über jedes Element im Array, das für alle Elemente zunächst 0 ist. Der Wert jedes Elements wird in der Variablen i gespeichert, die in Ihrer for-Schleife deklariert wird, wenn Sie die Array-Elemente durchlaufen.

12

Die Schleife ist äquivalent zu:

for(int j = 0; j < number.length; j++) { 
    int i = number[j]; 
    ... 
} 

wobei j eine intern erzeugte Referenz ist, die nicht mit normalen Benutzerkennungen kollidiert.

+0

Gilt das auch für Arrays von Referenztypen? Z.B.Wird Java diese Implementierung intern für ein Objekt [] verwenden, oder wird es etwas anderes tun (wie es in ein Iterable konvertieren)? – Karakuri

+0

@Karakuri Ich behaupte nicht einmal, dass dies tatsächlich für primitive Arrays implementiert ist, nur dass das erforderliche Verhalten äquivalent ist. Das erforderliche Verhalten für 'Object []' ist ebenfalls äquivalent. –

1

Das für jede über Arrays ist im Wesentlichen „Zucker“ über dieses Konstrukt:

for(int i = 0;i<number.length;i++) 
{ 
} 

I ich vorstellen würde dies als ein Konstrukt der Sprache zur Verfügung gestellt wurde, so dass Menschen, die verbesserten for-Schleife über eine Struktur verwenden könnten, die wurde auf die alte Art und Weise wiederholt.

+0

Das würde ich die Werte 0 bis Länge-1 geben. Es sollte die Werte der Array-Elemente nehmen, alle 0 im Beispielcode. –

+1

@PatriciaShanahan falsch, es gibt keinen Code in meinen Klammern. Ich erklärte das Konstrukt, das hinter dem Zucker vorkam. – Woot4Moo

2

ist dies äquivalent zu:

for(int x = 0; x < number.length; x++) { 
    int i = number[x]; 
} 
1

Dies entspricht ist:

final int len = number.length; 
for(int j = 0; j < len; j++) { 
    int i = number[j]; 
} 

beachte, dass der forEach der .length in jeder Schleife nicht auswerten. Dies könnte auch von der JVM, sondern vor allem bei Sammlungen beseitigt werden wird, wo wäre es

for(int j = 0; j < collection.size(); j++) { 

einige verwenden macht einen (kleinen) Unterschied zu dem schneller

int len = collection.size() 
for(int j = 0; j < len; j++) { 
+0

Danke, mir war nicht bewusst, dass jede Schleife nicht jedes Mal die Länge auswertete. –

6

einem bisschen spät , aber hier ist es.

Der Compiler weiß, ob Sie die Anweisung for-each loop für eine Auflistung oder für ein Array verwenden.

Wenn für die Sammlung verwendet wird, übersetzt der Compiler die for-each-Schleife in das entsprechende for-Schleife mit einer Iterator.

Bei Verwendung für ein Array übersetzt der Compiler die for-each-Schleife mit einer Indexvariablen in die entsprechende for-Schleife.

Here is a description at oracle.com

0

IntStream.range (1,4) verwendet werden, wenn java 8.

+0

Danke !!!!!!!!!! –