Schleifenindex "by reference" / "by value"

T

trez

Gast
Beim Hacken für einen anderen Thread bin ich auf einen interessanten Effekt gestossen.
(Das ist eher eine Feststellung als eine Frage und möglicherweise auch für andere Anfänger interessant ;-) )

Offensichtlich werden auch in diesem Konstrukt die Primitives "by copy" und die Anderen "by reference" an den Schlaufenindex übergeben

Java:
int[][] array = new int[5][3];
// Bewirkt nichts. Eclipse warnt auch "The value of the local variable i is not used"
for (int[] ia : array) {
	for (int i : ia ) {
		i = 42;
	}
}
// Funktioniert
for (int[] ia : array) {
	for (int i=0; i<ia.length; i++) {
		ia[i] = 42;
	}
}
 

VfL_Freak

Top Contributor
Moin,

Äh :eek: ... was genau willst Du uns sagen??

Java:
int[][] array = new int[5][3];
// Bewirkt nichts. Eclipse warnt auch "The value of the local variable i is not used"
for (int[] ia : array) {
	for (int i : ia ) {
		i = 42;
	}
}

// Funktioniert
for (int[] ia : array) {
	for (int i=0; i<ia.length; i++) {
		ia[i] = 42;
	}
}
(a) funktionieren tut beides !!
(b) die Warnung ist doch logisch! Du setzt 'n'-mal die Variable 'i' auf den Wert "42", benutzt 'i' aber nie!
(c) im zweiten Fall jedoch WIRD die Variable 'i' verwendet !!
EDIT
(d) "i = 42" und "ia = 42" sind was völlig verschiedenes :autsch:


Gruß
Klaus
 
Zuletzt bearbeitet:

nvidia

Bekanntes Mitglied
[...]
Offensichtlich werden auch in diesem Konstrukt die Primitives "by copy" und die Anderen "by reference" an den Schlaufenindex übergeben[...]

Das ist Unfug, dein Code ist falsch. Die äquivalente for-Schleife zu deinem Code-Block mit den erweiterten for-Schleifen ist Folgende:

Java:
for (int[] ia : array) {
            for (int i=0; i<ia.length; i++) {
                i = 42;
            }
        }

Und wie man sieht, sieht man genauso wenig.

Das was du mit den erweiterten for-Schleifen erreichen wolltest ist wie folgt möglich:

Java:
        for (int[] ia : array) {
            int col = 0;
            for (int i : ia) {
                ia[col++] = 42;
            }
        }

for-schleife
 

Natac

Bekanntes Mitglied
Das ist Unfug, dein Code ist falsch. Die äquivalente for-Schleife zu deinem Code-Block mit den erweiterten for-Schleifen ist Folgende:
Java:
for (int[] ia : array) {
            for (int i=0; i<ia.length; i++) {
                i = 42;
            }
        }
Auch falsch. Die "Umsetzung" einer foreach-Schleife sieht eher so aus:
Java:
for (int[] ia : array) {
    for (int index=0; index<ia.length; index++) {
      int i = ia[index];
      i = 42;
     }
}
 

nvidia

Bekanntes Mitglied
Auch falsch. Die "Umsetzung" einer foreach-Schleife sieht eher so aus:
Java:
for (int[] ia : array) {
    for (int index=0; index<ia.length; index++) {
      int i = ia[index];
      i = 42;
     }
}

Jipp, konnte nicht mehr editieren und war zu faul einen neuen Beitrag zu schreiben, da der Punkt hoffentlich rübergekommen war. :)
 
T

trez

Gast
Zeilen 18-22 bewirken im Array gar nichts, Zeilen 27 - 31 setzen die Werte im Array.

Ich wollte genau das sagen was schon oben steht - es ist eine Feststellung, dass auf den Zeilen 4, 18 und 27 der Wert per Reference, aber auf den Zeilen 5, 19 und 28 per Copy an den Index übergeben wird.

Der Code ist sicher kein Unfug, denn er zeigt einen Effekt, der mir bei Parametern längst bewusst war, aber nicht im Zusammenhang mit for-Schleifen.

Das war mir nicht bewusst und wird wohl manch anderem Anfänger auch nicht bewusst sein. Da ein Forum auch ein Archiv ist, gehören IMHO auch Feststellungen dahin.

Java:
public class ForSchleifenVersuch {

	private static void printArr(int[][] iarr) {
		for (int[] ia : iarr) {
			for (int i : ia ) {
				System.out.printf( "%03d ", i );
			}
			System.out.println();
		}
		System.out.println();
	}

	public static void main(String[] args) {
		int[][] array = new int[5][3];
		System.out.println("Neu angelegter Array");
		printArr(array);
		// Geht nicht
		for (int[] ia:array) {
			for (int i : ia ) {
				i = 42;
			}
		}
		System.out.println();
		System.out.println("Erster Versuch");
		printArr(array);
		// Funktioniert
		for (int[] ia : array) {
			for (int i=0; i<ia.length; i++) {
				ia[i] = 42;
			}
		}
		System.out.println();
		System.out.println("Zweiter Versuch");
		printArr(array);
	}
}

Output:
Neu angelegter Array
000 000 000 
000 000 000 
000 000 000 
000 000 000 
000 000 000 


Erster Versuch
000 000 000 
000 000 000 
000 000 000 
000 000 000 
000 000 000 


Zweiter Versuch
042 042 042 
042 042 042 
042 042 042 
042 042 042 
042 042 042

PS: Aehm - falls sich jemand mit Unit-Tests auskennt - ich bin immer noch auf der Suche nach Lösungsvorschlägen
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
Zeilen 18-22 bewirken im Array gar nichts, Zeilen 27 - 31 setzen die Werte im Array.

Ich wollte genau das sagen was schon oben steht - es ist eine Feststellung, dass auf den Zeilen 4, 18 und 27 der Wert per Reference, aber auf den Zeilen 5, 19 und 28 per Copy an den Index übergeben wird.

Ja bei den Zeilen 4, 18 und 27 arbeitest du auch mit einem Array, dieses ist laut Java Spezifikation ein Object -> "by reference". Wobei du bei den Zeilen 5, 19 und 28 mit int arbeitest einen primitiven Datentyp -> "by value"

Worin liegt die neue Erkenntnis? Primitives werden IMMER "by value" übergeben.
 

nvidia

Bekanntes Mitglied
[...]
Der Code ist sicher kein Unfug, denn er zeigt einen Effekt, der mir bei Parametern längst bewusst war, aber nicht im Zusammenhang mit for-Schleifen.
[...]

Letzter versuch, deine Aussage ist immer noch nicht richtig. Du behauptest folgendes würde nicht funktionieren wg. call by value, call by reference und zeigst folgenden Code.

Java:
int[][] array = new int[5][3];
// Bewirkt nichts. Eclipse warnt auch "The value of the local variable i is not used"
for (int[] ia : array) {
	for (int i : ia ) {
		i = 42;
	}
}
// Funktioniert
for (int[] ia : array) {
	for (int i=0; i<ia.length; i++) {
		ia[i] = 42;
	}
}

Der Code ist semantisch nicht äquivalent und das hat nichts mit call by value/reference zu tun. Deine erweiterten for-Schleifen sind identisch zu dem was Natac korrigiert postete. Der Unterschied zwischen deiner normalen for-Schleife wird hier sehr deutlich.

Java:
for (int[] ia : array) {
    for (int index=0; index<ia.length; index++) {
      int i = ia[index];
      i = 42;
     }
}

Des Weiteren gab es folgenden Code der genau das mit den erweiterten for-schleifen erreicht was du ursprünglich wolltest.

Java:
        for (int[] ia : array) {
            int col = 0;
            for (int i : ia) {
                ia[col++] = 42;
            }
        }

Dieser entspricht vom Verhalten dem folgenden Stück

Java:
for (int[] ia : array) {
    for (int index=0; index<ia.length; index++) {
      int i = ia[index];
      ia[index] = 42;
     }
}

Das Ergebnis daraus ist für jede Eingabe identisch zu deiner for-Schleifen-Variante.

[Java]
for (int[] ia : array) {
for (int i=0; i<ia.length; i++) {
ia = 42;
}
}
[/code]


Das einzige Problem was es hier gibt ist das du glaubst deine geposteten Code-Schnipsel seien identisch und schiebst das auf ein Problem mit call by value/reference.
 
T

trez

Gast
Worin liegt die neue Erkenntnis? Primitives werden IMMER "by value" übergeben.
Die Erkenntnis ist doch schlicht und einfach die, dass es sich im Kontext einer for-Schlaufe, was nicht als "Übergabe" im Sinne von f(x) erkennbar ist, eben doch um eine handelt.

Hm - wieso zerreisst ihr hier jetzt eine Feststellung die Anfängern weiterhelfen soll und zum Thema JUnit äussert sich niemand?
 
Zuletzt bearbeitet von einem Moderator:

VfL_Freak

Top Contributor
T

trez

Gast
Sorry, aber jeder meiner Posts war richtig wenn man es verstehen will. Wer Profi ist, wird es halt nicht mehr nachvollziehen können aber für Anfänger ist nicht nachvollziehbar, warum Java einen Teil by Reference und einen anderen Teil per Value macht, sogar dann wenn es sich NICHT um eine Paramterübergabe handelt.

Was das mit JUnit zu tun hat: Feststellungen wie diese hier werden vorwärts und rückwärts zerrissen aber auf die für mich wichtigere Frage, die hier, kommt keine Antwort

Nehmt doch die Herausforderung an ....
 

Natac

Bekanntes Mitglied
Okay, einen Versuch mach ich noch:

Wir haben folgendes array:
Java:
int[] array = {1,2,3,4,5};

Dein erster Code-Schnipsel:
Java:
        for (int i : array ) {// = for(int x=0;x<array.length;x++){ int i = array[x];
            i = 42;
        }
Verändert das Array NICHT. Es ist immernoch 1,2,3,4,5. Eben weil du nur die Variable i überschreibst. Diese enthält zwar den Wert an der Stelle x, aber sie "aktualisiert" ihn nicht, wenn du die "i" änderst. Zu beachten ist hier auch, dass "i" NICHT der index ist. Ähnlich wäre:
Java:
List<String> list = new ArrayList();
String s = "hello";
list.add(s); //s wird by value übergeben. Die add-Methode erhält eine Kopie.
s = "world";//ändert NICHT die Liste, sondern nur den Variableninhalt von s

Dein zweiter Code (vereinfacht - ich habe statt "i" wieder "x" für den index genommen, wie im obigen Code auch):
Java:
        for (int x=0; x<array.length; x++) {
           array[x] = 42; 
        }
Das Array ist hinterher 42,42,42,42,42. Da du an jedem index "x" den Wert im Array auf den 42 setzt. Zu beachten ist her, dass die Variable "i" aus dem ersten Code-Schnipsel gar nicht auftaucht. Wollten wir ein "i" einfügen, das sich genauso wie im ersten Code-Schnipsel verhält, würde das so aussehen:
Java:
  for (int x=0; x<array.length; x++) {
           array[x] = 42; 
           int i = x; // sinnlos, da mit i nichts gemacht wird.
        }

Ich denke dich verwirrst die Tatsache, dass du in beiden Code-Schnipseln eine Variable "i" verwendest, die aber jeweils für einen völlig anderen Wert steht. Denk nochmal drüber nach. ;)

PS: Dieser Artikel könnte vielleicht für dich interessant sein.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Schleifenindex in Variablennamen einbauen Java Basics - Anfänger-Themen 9
J Java call by Value oder Reference Java Basics - Anfänger-Themen 35
R Call-by-Value, Call-by-Reference, Call-by-Name Ausgabe Java Basics - Anfänger-Themen 1
X Verständnisproblem Call-By-Reference Java Basics - Anfänger-Themen 5
U Worin besteht der Unterschied zwischen call by reference und call by value? Java Basics - Anfänger-Themen 14
M Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 10
H call by reference & value Java Basics - Anfänger-Themen 14
T Boolean by Reference Java Basics - Anfänger-Themen 6
O Socket by reference übergeben Java Basics - Anfänger-Themen 0
A Cannot make a static reference to the non-static field Java Basics - Anfänger-Themen 6
B Call by Value/Reference Java Basics - Anfänger-Themen 4
O Illegal Group Reference Java Basics - Anfänger-Themen 4
Joew0815 Methoden Objekt als Methoden-Parameter - Kein call-by-reference? Java Basics - Anfänger-Themen 12
L Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 6
T Array prozedur, call by reference ? Java Basics - Anfänger-Themen 6
B Variablen Wie macht man eine call by reference mit primitiven Datentypen in Java? Java Basics - Anfänger-Themen 2
K Variablen Cannot make a static reference to the non-static field time Java Basics - Anfänger-Themen 6
P Compiler-Fehler Cannot make a static reference to the non-static field process Java Basics - Anfänger-Themen 3
C Reference - wird gegen meinen Willen - auf null gesetzt Java Basics - Anfänger-Themen 2
S call by reference? Java Basics - Anfänger-Themen 52
F Verständisproblem bzgl. nicht Vorhandensein von Call-by-reference Java Basics - Anfänger-Themen 2
F Mal wieder: Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 9
F Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 3
B Call By reference (Null pointer exception) Java Basics - Anfänger-Themen 6
M Reference Java Basics - Anfänger-Themen 2
C Call by reference Java Basics - Anfänger-Themen 11
W call-by-reference-Effekt bei Objekten Java Basics - Anfänger-Themen 3
B Cannot make a static reference...?? Java Basics - Anfänger-Themen 5
B Mal wieder "cannot make a static reference..." Java Basics - Anfänger-Themen 2
N Reference to non-static method Java Basics - Anfänger-Themen 8
S "Call by Reference" Java Basics - Anfänger-Themen 12
M try-catch, call-by-reference, Streaming und Strings Java Basics - Anfänger-Themen 10
S call by reference Java Basics - Anfänger-Themen 7
C Passing Reference by Value Java Basics - Anfänger-Themen 4
G Wieso ist eine String-Übergabe keine by-reference-Zuweisung? Java Basics - Anfänger-Themen 7
R Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 5
F Wie kann ich call by reference umgehen? Java Basics - Anfänger-Themen 14
L [Gelöst] Cannot make a static reference ... Java Basics - Anfänger-Themen 12
F Rekursive Aufrufe, Parameterübergabe, call by reference Java Basics - Anfänger-Themen 3
N Connot make a static reference. deklarierungsfehler Java Basics - Anfänger-Themen 10
F Call-By-Reference umgehen Java Basics - Anfänger-Themen 4
T object reference counts Java Basics - Anfänger-Themen 14
T Cannot make a static reference to the non-static field Java Basics - Anfänger-Themen 8
B Call by Reference Java Basics - Anfänger-Themen 7
frau-u Altes Problem: non-static method cannot be reference Java Basics - Anfänger-Themen 7
S call by reference vs. call by value - pls help Java Basics - Anfänger-Themen 7
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
I JSON - cannot deserialize from Object value Java Basics - Anfänger-Themen 16
C Long value an Stringbuilder übergeben, equals Methode funktioniert nicht Java Basics - Anfänger-Themen 2
D String value change listener Java Basics - Anfänger-Themen 2
G Java Object value und entity? Java Basics - Anfänger-Themen 2
ms_cikar Den Wert einer Hex. value bestimmten. Java Basics - Anfänger-Themen 8
R Boolean value ohne Kontrollstrukturen ändern Java Basics - Anfänger-Themen 5
F Entity vs value Java Basics - Anfänger-Themen 3
R Value von einem JSON-Objekt ausgeben Java Basics - Anfänger-Themen 4
V NullPointerException, wenn Key und Value null sind Java Basics - Anfänger-Themen 2
K Value eines HashMaps in einer HashMap wiedergeben. Java Basics - Anfänger-Themen 5
E jProgressbar, 6 Versuche, welche value angeben ? Java Basics - Anfänger-Themen 3
G Klassen Call by Value auch bei Objekten? Java Basics - Anfänger-Themen 2
E Hash map Value Wert hochzuholen/ändern Java Basics - Anfänger-Themen 7
J Variablen Komsiche System.in.read() return-value? Java Basics - Anfänger-Themen 3
N JFreeChart - Value und veriable Zeitachse Java Basics - Anfänger-Themen 15
J Open Office Property Value mit Java aufrufen Java Basics - Anfänger-Themen 0
R Property Value als null setzen Java Basics - Anfänger-Themen 1
O Erste Schritte TreeMap nach Value sortieren Java Basics - Anfänger-Themen 2
B Compiler-Fehler Hilfe!!! required variable ; found value Java Basics - Anfänger-Themen 4
M Arrays als return Value? Java Basics - Anfänger-Themen 2
S Integer/Value-Paar in Prio-Queue ohne Comparator Java Basics - Anfänger-Themen 5
V Methoden key value Parameter Java Basics - Anfänger-Themen 11
C Probleme bei einem Stringvergleich - Attribut "value" unterscheidet sich Java Basics - Anfänger-Themen 9
F HashMap nach kleinstem Value durchsuchen Java Basics - Anfänger-Themen 11
D TreeMap: Höheren Key ermitteln und den Value liefern Java Basics - Anfänger-Themen 3
Todesbote Map (Key=String; Value = Vector) Value/Vector sortieren Java Basics - Anfänger-Themen 13
B Variablen unique Value Java Basics - Anfänger-Themen 12
R Key/Value ohne Maps? Java Basics - Anfänger-Themen 2
B Datentypen Key/Value sortieren Java Basics - Anfänger-Themen 15
S Warnung in Eclipse: unassigned closeable value Java Basics - Anfänger-Themen 20
J Objectreferenz statt value an Methode uebergeben? Java Basics - Anfänger-Themen 2
K HashMap auf leere Key-Value-Paare prüfen Java Basics - Anfänger-Themen 14
C Collections String[] als value in HashMap Java Basics - Anfänger-Themen 6
P Key anhand von Value finden (Hashtable) Java Basics - Anfänger-Themen 3
B JavaSkript Form-Tag Value & Post Java Basics - Anfänger-Themen 6
M String( char[] value ) Java Basics - Anfänger-Themen 3
feardorcha Java von Kopf bis Fuß "Java ist Pass-by-Value" Java Basics - Anfänger-Themen 6
M Value-returing Methode funktioniert nicht Java Basics - Anfänger-Themen 4
O Was bedeutet public class value? Java Basics - Anfänger-Themen 3
M jSpinner: nur angezeigte Value auslesen? Java Basics - Anfänger-Themen 3
F Erste Schritte return (char)toUnsignedInt(value) Java Basics - Anfänger-Themen 2
J unexpected type variable/value Java Basics - Anfänger-Themen 2
F Hilfe Regular Expression Grouping Value Java Basics - Anfänger-Themen 3
K unexpected type variable/value Java Basics - Anfänger-Themen 7
turmaline Duration Value Java Basics - Anfänger-Themen 8
T Enum - Key als Value ermitteln Java Basics - Anfänger-Themen 7
K java pass by value Java Basics - Anfänger-Themen 29
capgeti Datentypen Static generic return value von Subclass? Java Basics - Anfänger-Themen 9
A ein map key/value"problem" Java Basics - Anfänger-Themen 9
A Regex get Value Java Basics - Anfänger-Themen 5
D Key und Value aus hashMap speichern Java Basics - Anfänger-Themen 7
M HashMap-Value | Array Java Basics - Anfänger-Themen 3
N Methode erfüllt nicht den zweck (Call by value) Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben