Warum wird Array durch Methode ohne Rückgabewert verändert?

jabo

Mitglied
Hallo,

warum wird ein Array verändert, wenn man es einer Methode übergibt, die die Einträge des übergebenen Array verändert, aber kein Array zurückgibt, aber ein z.B. ein int (als Beisiel für einen primitiven Datentyp) oder String (als Beispiel für einen Referenztyp) nicht?
Auf ein Array hat eine Methode offensichtlich einen Seiteneffekt, warum? Ich dachte Parameter werden in Java per call-by-value übergeben?

Zur Verdeutlichung meiner Frage folgenden Codeabschnitt:
Java:
public static void main(String[] args) {
	int[] a = {1,2,3,4,5,6,7,8,9};	
	setTo2(a);
		
	 for (int zahl : a)
		 System.out.printf("%d ", zahl);   // 2 2 2 2 2 2 2 2 2
	 System.out.printf("\n");
		
	 int b = 1;
	 setTo2(b);
         System.out.println(b);   // 1
		
	String c = new String("eins");
	setTo2(c);
	System.out.println(c);   // eins
	}
	
	static void setTo2(int[] array) {
		for (int i = 0; i < array.length; i++) {
			array[i] = 2;
		}
	}
	
	static void setTo2(int arg) {
		arg = 2;	
	}
	
	static void setTo2(String arg) {
		arg = "zwei";	
	}
}

Über eure Hilfe würde ich mich freuen.
Vielen Dank!
 

jabo

Mitglied
ok, und bei String wird auch die Referenz auf den String übergeben? Dann müsste der String durch die Methode setTo2(String arg) ja auch geändert werden, wie das Array durch setTo2(int[] array) geändert werden? Wird er aber ja nicht und der int auch nicht.
 

Thallius

Top Contributor
Das liegt daran, dass ein Array nicht wirklich eine Variable ist sondern nur ein Container für Variablen.

In meinen Augen ist das tatsächlich eine inkonsistenz in der Java Definition. Das wurde aber sicherlich mit Absicht gemacht, da sonst bei der Übergabe von einem Array von mehreren hundert tausend Einträgen die immer komplett im Speicher kopiert werden müßten, was sehr schnell zu einem out of memory führt wenn man das Array durch ein paar Ebenen reicht. Bei Listen und anderen Collections ist das genauso.

Gruß

Claus
 

Joose

Top Contributor
ok, und bei String wird auch die Referenz auf den String übergeben? Dann müsste der String durch die Methode setTo2(String arg) ja auch geändert werden, wie das Array durch setTo2(int[] array) geändert werden? Wird er aber ja nicht und der int auch nicht.

Bei primitiven Datentypen: int, long, double usw. wird nur eine Kopie des Wertes übergeben (also wirkliches Call-by-value).
String ist ein Objekt, hier wird tatsächlich nur eine Referenz übergeben. Aber String ist eine immutable Klasse, sprich der Wert von einem String Objekt kann sich nicht ändern sondern es muss immer ein neues String Objekt erzeugt werden.
 

jabo

Mitglied
Vielen Dank für eure Antworten!

Bei primitiven Datentypen: int, long, double usw. wird nur eine Kopie des Wertes übergeben (also wirkliches Call-by-value).
String ist ein Objekt, hier wird tatsächlich nur eine Referenz übergeben. Aber String ist eine immutable Klasse, sprich der Wert von einem String Objekt kann sich nicht ändern sondern es muss immer ein neues String Objekt erzeugt werden.
Das erklärt es! Ich habe es jetzt mal mit anderen mutable Objekten ausprobiert und siehe da, es verhält es sich wie mit den Arrays. Als Beispiel:
Java:
static void main(String[] args) {
      Date d = new Date(2015, 3, 10);
      setToYesterday(d);
      System.out.println(d);   // Fri Apr 09
}

static void setToYesterday(Date date) {
	date.setDate(9);
}
Also nochmals vielen Dank an alle!
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Iterieren durch eine ArrayList. Integer Array wird übergeben Java Basics - Anfänger-Themen 17
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
sserio Zweidimensionales Array [][] wird untereinander ausgegeben Java Basics - Anfänger-Themen 14
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
H Array wird als Rückgabewert nicht akzeptiert? Java Basics - Anfänger-Themen 2
A char array wird überschrieben Java Basics - Anfänger-Themen 6
NeoLexx Variable für Array wird nicht korrekt übergeben Java Basics - Anfänger-Themen 45
P Array wird automatisch überschrieben Java Basics - Anfänger-Themen 3
B Gefülltes Array wird mit nullwerten übergeben Java Basics - Anfänger-Themen 9
Bluebird209 Array wird nicht an Methode übergeben Java Basics - Anfänger-Themen 7
E Methoden 2D Array wird in der Methode nicht geändert/gespeichert Java Basics - Anfänger-Themen 5
E Wie wird in Java ein Char-Array terminiert ? Java Basics - Anfänger-Themen 15
L [Verständnisproblem] Array wird trotz void rückgabe verändert. Java Basics - Anfänger-Themen 5
D Array wird immer mir 100 für jeden Wert initialisiert? Java Basics - Anfänger-Themen 2
Silvascus Array, der mit dem Namen, der per Methode übergeben wird, erstellt wird Java Basics - Anfänger-Themen 5
C Array wird falsch befüllt? Java Basics - Anfänger-Themen 7
T Array wird überschrieben Java Basics - Anfänger-Themen 4
L Schleifen und Array, nur letzte Eingabe wird ausgegeben Java Basics - Anfänger-Themen 3
S Array wird nicht übernommen NullPointerException Java Basics - Anfänger-Themen 6
D Array Objekt wird überschrieben Java Basics - Anfänger-Themen 3
L Wie wird ein 2 Dimensionales Array befüllt? Java Basics - Anfänger-Themen 6
C Array Aktualisierung wird nicht im Tooltip angezeigt Java Basics - Anfänger-Themen 2
H Array wird verändert ohne Rückgabe? Java Basics - Anfänger-Themen 7
P Datentypen String auf JTextField wird zu Char-Array und anschließend zu int Java Basics - Anfänger-Themen 12
A Array wird nicht durchlaufen Java Basics - Anfänger-Themen 10
F Variablen String-Array wird ungewollt "überschreiben" Java Basics - Anfänger-Themen 7
M Array wird beim Neuaufruf nicht neu initialisiert Java Basics - Anfänger-Themen 9
D Erste Schritte Warum wird bei einem Array die Länge über Length ausgegeben? Java Basics - Anfänger-Themen 6
A Ein Array aus einer Klasse wird nicht sauber abgefüllt Java Basics - Anfänger-Themen 4
A OOP Array wird ohne grund sortiert?! Java Basics - Anfänger-Themen 4
I Array und variable gleicher wert, wird jedoch nicht erkannt Java Basics - Anfänger-Themen 4
B Array-objekte,. Es wird ein Fehler ausgegeben Java Basics - Anfänger-Themen 11
A Array wird überschrieben Java Basics - Anfänger-Themen 5
B Array von Choice wird nicht von getSelectedItem erkannt Java Basics - Anfänger-Themen 3
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
H JDK installieren jdk-21 wird nicht erkannt Java Basics - Anfänger-Themen 13
T if-else Bedingung wird ignoriert Java Basics - Anfänger-Themen 4
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
P Webseite vom Smartmeter wird nur unleserlich angezeigt Java Basics - Anfänger-Themen 7
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
T catch(InputMismatchException) wird nicht ausgefürt/erkannt Java Basics - Anfänger-Themen 12
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
Oneixee5 Maven Plugin wird 2 mal ausgeführt Java Basics - Anfänger-Themen 10
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
C Was tun wenn .class erwartet wird ? Java Basics - Anfänger-Themen 6
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
MiMa Ungültiges Datum wird nicht erkannt ?? Java Basics - Anfänger-Themen 6
schemil053 Multithread - Input verrutscht während etwas ausgegeben wird Java Basics - Anfänger-Themen 6
K REGEX - Rechnungsbetrag wird nicht richtig ausgelesen. Java Basics - Anfänger-Themen 3
_user_q Timer - ScheduledExecutorService wird schon vorher beendet Java Basics - Anfänger-Themen 5
X Erste Schritte Scanner eingabe wird übersprungen Java Basics - Anfänger-Themen 4
H Compiler-Fehler Klasse in einem Package wird nicht gefunden bzw. akzeptiert Java Basics - Anfänger-Themen 12
L Switch-Case Multiplikation wird nicht ausgegeben Java Basics - Anfänger-Themen 1
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
M Text wird in der Console nicht ausgegeben. Java Basics - Anfänger-Themen 11
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Math. Befehl wird rot markiert Java Basics - Anfänger-Themen 5
M Rechteck wird nicht angezeigt Java Basics - Anfänger-Themen 3
B Bungeecord | ProxiedPlayer wird nicht in ArrayList hinzugefügt Java Basics - Anfänger-Themen 1
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
S Methoden Return Rückgabewert wird nicht übergeben Java Basics - Anfänger-Themen 8
M Mein quellcode wird nicht in der Konsole ausgegeben Java Basics - Anfänger-Themen 3
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
M wird der Konstruktor nicht als 1. ausgeführt? Java Basics - Anfänger-Themen 13
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
K Präzedenregeln in Java sagen, dass +expr und -expr vor + von Addition und - von Addition stehen, warum wird dann z. B. a+b als eine Addition ausgeführ Java Basics - Anfänger-Themen 7
M Was wird hier genau getestet? Java Basics - Anfänger-Themen 9
M Wie schreibe ich eine if-Verzweigung um, so dass ein Bedingungsoperator benutzt wird? Java Basics - Anfänger-Themen 9
K Jlabel mit itemlistevent Text gegeben, wird nicht angezeigt Java Basics - Anfänger-Themen 5
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
M Referenzen zuweisen und wird gleichzeitig ausgeführt Java Basics - Anfänger-Themen 6
O System.out.println wird nicht ausgegeben? Java Basics - Anfänger-Themen 11
Zrebna Umgebungsvariable Wieso wird meine verwendete JDK-Version in der Prompt nicht erkannt? Java Basics - Anfänger-Themen 6
el_pato DialogFenster wird nicht in Schleife geöffnet? Java Basics - Anfänger-Themen 30
J if-Schleife innerhalb einer if-Schleife wird in der Konsole nicht gelesen Java Basics - Anfänger-Themen 4
P Apache Derby wird in Eclipse trotz Anbindung nicht gefunden Java Basics - Anfänger-Themen 6
Poppigescorn scan.nextInt() wiederholen bis eine Zahl eingeben wird Java Basics - Anfänger-Themen 7
F Session wird mehrfach erzeugt Java Basics - Anfänger-Themen 11
F Initialisieren eines Web-Mp3 Players in Tabs durch "booleans" erst wenn Tab geöffnet wird ...? Java Basics - Anfänger-Themen 1
fuerteb Compiler-Fehler Methode wird nicht bzw. als Fehler erkannt Java Basics - Anfänger-Themen 4
L JScrollPane wird nicht angezeigt Java Basics - Anfänger-Themen 10
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
J JTable Titel wird nicht angezeigt Java Basics - Anfänger-Themen 6
krgewb Long wird gerundet Java Basics - Anfänger-Themen 2
Zwanglos Warum wird nur die erste Zeile im while Block ausgeführt? Java Basics - Anfänger-Themen 8
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
H GridPane wird nicht angezeigt Java Basics - Anfänger-Themen 0
M Was habe ich hier falsch, dass wenn ich z.B.: 11 eingebe mir false zurück gegeben wird? Java Basics - Anfänger-Themen 2
M Java Spiel wie Wer wird Millionär Java Basics - Anfänger-Themen 1
H Endkapital wird nicht korrekt ausgegeben. Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben