ArrayList Referenz

Status
Nicht offen für weitere Antworten.

Kris

Bekanntes Mitglied
Hallo

ich habe ein kleoines Verständnisprolem.

Wenn ich in einem Objekt eine Variable des Typs ArrayList erstelle, und diese dann an ein Objekt weiter gebe, dann kann das Objekt diese bearbeiten.
Mit add klappt alles super. Wenn aber eine neue ArrayList des selben Typs erstellt wird und diese dann der übergebenen Variable zugewiesen wird, dann werden die Werte nicht übergeben.

Ein kleines Beispiel siehe unten. Gibt es dafür eine Lösung bzw. könnte mir jemand erklären warum dies der Fall ist?

[HIGHLIGHT="Java"]package test;

import java.util.ArrayList;
import java.util.List;


/**
* @author Kris
*
*/
public class Main {

private List<String> strings;

/**
*
*/
public Main(){
strings =new ArrayList<String>();
gebeAus();
new Child(this, strings).aendereStrings();
gebeAus();
new Child(this, strings).erneuere();
gebeAus(); // keine Ausgabe, da die Werte verlorengegangen sind
}

/**
*
*/
public void gebeAus(){
for(int i=0;i<strings.size();i++){
System.out.println(strings.get(i));
}
}
/**
* @param args
*/
public static void main(String[] args) {
new Main();
}

}[/CODE]

Code:
package test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Kris
 */
public class Child {

	private List<String> strings;
	private Main main;

	/**
	 * @param main
	 * @param strings
	 */
	public Child(Main main, List<String> strings) {
		this.main = main;
		this.strings = strings;
		for (int i = 0; i < 20; i++) {
			strings.add("Test" + i);
		}
	}

	/**
	 * 
	 */
	public void aendereStrings() {
		for (int i = 0; i < strings.size(); i++) {
			strings.set(i, strings.get(i) + "A");
		}
		main.gebeAus();
	}

	/**
	 * 
	 */
	public void erneuere() {
		List<String> neueListe = new ArrayList<String>();
		for (int i = 0; i < 20; i++) {
			neueListe.add("ZZ" + i);
		}
		strings = neueListe;
	}
}[/HIGHLIGHT]
 
Zuletzt bearbeitet von einem Moderator:

Ravendark

Aktives Mitglied
Wenn du in Java eine Referenz als Parameter übergibst, dann kannst du zwar das worauf die Referenz zeigt verändern (sprich den Inhalt des Objektes worauf die Referenz zeigt), aber wenn du die Referenz an sich änderst, hat das keine Auswirkungen auf das Objekt, mit der diese Methode aufgerufen wird.
Liegt daran dass in Java immer nur eine Referenzkopie an die Methode übergeben wird.
 

Kris

Bekanntes Mitglied
Also veränder man mit

[HIGHLIGHT="Java"]strings = neueListe;[/HIGHLIGHT]

nur die Referenz.

Das Objekt muss man dann so bearbeiten?

[HIGHLIGHT="Java"]neueLsite.removeAll(neueListe);
strings.addAll(neueListe);[/HIGHLIGHT]
 
Zuletzt bearbeitet von einem Moderator:

Ravendark

Aktives Mitglied
Kris hat gesagt.:
Also veränder man mit

[HIGHLIGHT="Java"]strings = neueListe;[/HIGHLIGHT]
nur die Referenz.
Damit weist du der Referenzvariablen strings die Referenz neueListe zu. D.h strings beinhaltet jetzt eine Referenz zu dem Objekt, welches neueListe referenziert.
 
Zuletzt bearbeitet von einem Moderator:
S

Spacerat

Gast
Hier wird ausschliesslich die Liste von "Child" erneuert. Die Referenz auf "main.strings" geht bei "child.strings = neueListe" verloren. "Child.erneuere()" müsset ungefähr so aussehen.[HIGHLIGHT="Java"]public void erneuere()
{
strings.clear();
for(int i = 0; i < 20; i++) {
strings.add("ZZ" + i);
}
}[/HIGHLIGHT]
 
Zuletzt bearbeitet von einem Moderator:

beastofchaos

Bekanntes Mitglied
Ich weiß - älteres Thema, aber besser als neuer Thread ;)

Ich habe eine Methode, die ursprüglich eine ArrayList<Integer> übergibt und als Parameter einen String erwartet. Die Methode splittet den String und macht daraus Integers, die in die ArrayList verschoben. Leider muss ich jetzt aber außerhalb der Methode wissen, ob es auch erfolgreich war. Deswegen ist nun die ArrayList ein Parameter und es wird ein boolean übergeben.

Selbes Problem: Die Änderungen durch add werden nicht als Referenz übergeben. Bisher war hier die Ausweichmöglichkeit, dass in der Methode die globale Variable direkt verändert wird und nicht nur ein Parameter, doch bei mir sind es zwei getrennte Klassen, wo ich es lieber mit einem Paramet schaffen will :)

Hier die Methode, und wo sie einmal z.B. aufgerufen wird:

Java:
 private void actualize(boolean close){
        if (!Sound.getArray(main.sounds, textSounds.getText())){
            return;
        }
        ...

Java:
public static boolean getArray(ArrayList<Integer> array, String string){
        array = new ArrayList<Integer>();                                   // Geht mit und ohne nicht
        ...
        array.add(Integer.parseInt(string));                                // Per While-Schleife wird diese Stelle öfters ausgerufen
        ...
        return true;                                                        // Nur ein möglicher Ausgang
    }

Hab ich schon mit Debugger durchlaufen lassen. Die Methode macht, was sie soll, aber wenn ich aus der Methode wieder rausgehe, ist alles beim alten :/

Freu mich über schnelle Antworten :p
Gruß, Thomas
 

ARadauer

Top Contributor
Code:
array = new ArrayList<Integer>();                                   // Geht mit und ohne nicht
das ist genau der Punkt. Dein Aufrufer zeigt auf Liste A und jetzt machst du eine Liste B und fügst dort ein. Dein Aufrufer sieht aber immer noch A.
Warum geht es ohne nicht, füg doch einfach in die übergebene Liste ein? Wenn das nicht funktioniert liegt der Fehler wo anders, zb Sound.getArray

Wobei ich hier schon sehe, dass du dir vielleicht nochmal Objekte im Allgemeinen ansehen solltest.

Zeig mal Sound.getArray
 

beastofchaos

Bekanntes Mitglied
Ich dachte mir auch shcon, dass die Referenz wohl entfällt, wenn ich den Konstruktor aufrufe... :/ Glaubst, ich krieg das mit clear() hin? Sonst werd ich halt einfach vor dem Methodenaufruf von getArray() schon clear() aufrufen.

Ok, mit clear() funktioniert es :p
Hier die Methode vollständig:

Java:
 public static boolean getArray(ArrayList<Integer> array, String string){
        array.clear();
        boolean lastItem = false;
        boolean continueWhile = true;
        while (continueWhile){
            int cutter = 3;                                                     // Nur dreistellige Zahlen möglich
            try{
                if (lastItem){
                    array.add(Integer.parseInt(string));
                    //continueWhile = false;
                    break;
                }
                
                boolean testInt = false;
                try{
                    Integer.parseInt(string.substring(0, 1));
                }catch(NumberFormatException tempExc){
                    testInt = true;
                }
                
                try{
                    Integer.parseInt(string.substring(cutter, cutter + 1));
                    testInt = true;
                }catch(NumberFormatException tempExc){}
                
                try{
                    Integer.parseInt(string.substring(cutter + 2, cutter + 3));
                    testInt = true;
                }catch(NumberFormatException tempExc){}
                
                if (testInt){
                    throw new NumberFormatException();
                }
                
                array.add(Integer.parseInt(string.substring(0, cutter)));
                string = string.substring(cutter + 3, string.length());
                if (lastItem){
                    continueWhile = true;
                }
                else if(string.length() < 9){
                    lastItem = true;
                }
                
            }catch(NumberFormatException exc){
                JOptionPane.showConfirmDialog(null, "Schema: dreistellige Zahl + ' ' + '-' + ' '" + '\n' + "Beispiel: 002 - 100 - 060 - 062" + '\n' + 
                                              "Standardersatzwerte: Ton = 060, Lautstärke = 080", "Falsche Definition von Ton oder Lautstärke", JOptionPane.DEFAULT_OPTION);
                return false;
            }
        }
        return true;
    }

Damit ihr Bescheid wisst, mein Programm ist eine Art Stoppuhr. Weil mein Compi keine hat, aber ich selbst mal schnell gemacht :p Wie das so ist, will man immer mehr dazu machen. Jetzt hab ich noch einen Sound eingebaut, der abgespielt wird, wenn man eine angegebene Zeit erreicht hat. Das gibt man in einem JTextfield an, mit dem Schema "dreistellige Zahl, Leertaste, Minus, Leertaste,..."
Das ich da mehrere try-Strukturen hab, soll jetzt nicht wundern, denn ich will schauen, dass da keine Zahlen sind. Wenn Zahlen sind, wird der catch-Block nicht aufgerufen und die Variable "testInt" wird auf true gesetzt. Am Ende wirft er bei testInt = true eine Exception :D Aufwendig, unschön, aber besser gehts nicht ;)

Gru und Dankeschön, Thomas
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M ArrayList oder LinkedList Allgemeine Java-Themen 10
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
B Type mismatch: cannot convert from Graph.Edge to ArrayList<Graph.Edge> Allgemeine Java-Themen 21
R ArrayList Allgemeine Java-Themen 4
G jToggleButton in Array/ArrayList Allgemeine Java-Themen 12
J ArrayList, ganze Zeilen löschen oder überspringen Allgemeine Java-Themen 4
L ArrayList sortieren Allgemeine Java-Themen 2
C ArrayList Problem Allgemeine Java-Themen 3
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
S Best Practices CopyConstrutor mit ArrayList Allgemeine Java-Themen 1
S ArrayList Design Allgemeine Java-Themen 4
S Array dynamisieren oder ArrayList verwenden? Allgemeine Java-Themen 17
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
H Elemente aus ArrayList in Array speichern Allgemeine Java-Themen 8
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
X Adjazenzliste ohne ArrayList Allgemeine Java-Themen 6
X Output von ArrayList Allgemeine Java-Themen 3
H Stream in ArrayList umwandeln Allgemeine Java-Themen 2
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
H Arraylist mit anderer ArrayList überschreiben Allgemeine Java-Themen 17
MiMa ArrayList sortieren?? Allgemeine Java-Themen 5
Curtis_MC Pointer mit ArrayList vergleichen Allgemeine Java-Themen 6
F ArrayList`s in Klassen mit Getter/Setter Allgemeine Java-Themen 8
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
F Arraylist vollständig abspeichern und laden Allgemeine Java-Themen 1
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
D ArrayList Indexlänge ändern Allgemeine Java-Themen 2
E Elemente innerhalb einer ArrayList vergleichen Allgemeine Java-Themen 33
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
N Mehrdimensionale ArrayList mischen Allgemeine Java-Themen 10
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
MiMa Date aus einer ArrayList<Date> holen ?? Allgemeine Java-Themen 5
MiMa ArrayList Rückgabewerte aus einer Funktion Allgemeine Java-Themen 15
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
T Collections ArrayList Sortieren Allgemeine Java-Themen 4
P GUI: ArrayList anzeigen funktioniert nicht Allgemeine Java-Themen 5
H ArrayList: Leere Elemente finden? Allgemeine Java-Themen 2
GreenTeaYT Verständnisprobleme zur Arraylist Allgemeine Java-Themen 1
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
K ArrayList sortieren Allgemeine Java-Themen 16
A Bestimmte Inhalte aus ArrayList 1 in ArrayList 2 kopieren Allgemeine Java-Themen 6
S Mehrdimensionales ArrayList ins HashSet Allgemeine Java-Themen 10
C ArrayList Allgemeine Java-Themen 8
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
K Array in ArrayList Allgemeine Java-Themen 16
Paul15 2D Arraylist in Jtable Allgemeine Java-Themen 1
Paul15 Arraylist 2D Allgemeine Java-Themen 8
B ArrayList in ein Objekt legen Allgemeine Java-Themen 1
Neumi5694 Datentypen ArrayList vs TreeMap Allgemeine Java-Themen 6
F ArrayList Allgemeine Java-Themen 11
X ArrayList will nicht so wie ich will. Hilfe Allgemeine Java-Themen 8
N ArrayList in eigenem Object nicht richtig serialisierbar Allgemeine Java-Themen 14
M ArrayList mit verschiedenen Datentypen in String konvertieren Allgemeine Java-Themen 10
Z Elemente einer ArrayList von rechts wegnehmen Allgemeine Java-Themen 5
W Arraylist Text Suchen und Datei löschen Allgemeine Java-Themen 5
R ArrayList und HashMap Allgemeine Java-Themen 7
T ArrayList zeilenumbruch entfernen Allgemeine Java-Themen 13
D Arraylist/For Schleife/Scanner Allgemeine Java-Themen 30
E ArrayList Anzahl der gleichen Elemente Allgemeine Java-Themen 4
Doopy ArrayList plötzlich leer Allgemeine Java-Themen 2
D Arraylist eigener Klasse an iReport übergeben Allgemeine Java-Themen 7
L ArrayList Inhaltstyp. Allgemeine Java-Themen 5
Z Klassen ArrayList selbst machen Allgemeine Java-Themen 5
J Arraylist speichern und laden? Allgemeine Java-Themen 5
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
D ArrayList index auf gültigkeit prüfen Allgemeine Java-Themen 12
M ArrayList<String> Frage Allgemeine Java-Themen 7
O ArrayList kaputt?! Allgemeine Java-Themen 5
M ArrayList<Foo> in ein Foo[] konvertieren? Allgemeine Java-Themen 8
Bananabert Abstract ArrayList Allgemeine Java-Themen 4
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
O ArrayList - Serialisierungs-Problem Allgemeine Java-Themen 11
M JTable + ArrayList Allgemeine Java-Themen 3
M Datentypen ArrayList in Integer konvertieren Allgemeine Java-Themen 3
O Collections ListIterator gibt Inhalt von ArrayList nicht aus Allgemeine Java-Themen 3
Madlip Variablen 3 Werte aus ArrayList und weiter ... Allgemeine Java-Themen 4
S arraylist nach n. Eintrag numerisch Sortiren Allgemeine Java-Themen 5
O Problem beim Auslesen einer Arraylist von JComboBoxen Allgemeine Java-Themen 2
R Threads korrekte Synchronisation bei Vector und ArrayList Allgemeine Java-Themen 6
M Kovariante Rückgabewerte mit ArrayList Allgemeine Java-Themen 3
H LinkedList<LinkedList<String>> nach ArrayList<ArrayList<String>> ? Allgemeine Java-Themen 9
E NetBeans Vector durch ArrayList ersetzen Allgemeine Java-Themen 4
Maxim6394 Problem mit ArrayList Allgemeine Java-Themen 5
E Berechnung in Arraylist Allgemeine Java-Themen 10
E ArrayList mit unbekannter Größe Allgemeine Java-Themen 8
V Fork Join bei Arraylist Allgemeine Java-Themen 6
H Fehler in Arraylist Allgemeine Java-Themen 2
S Datensätze in eine ArrayList<Movie> speichern Allgemeine Java-Themen 13
S Alle Kombinationen aus ArrayList - Potenzmenge Allgemeine Java-Themen 7
V ArrayList vergleichen mit .equals? Allgemeine Java-Themen 13
J ArrayList-Problem Allgemeine Java-Themen 16
S Von einer ArrayList in die andere schreiben? Allgemeine Java-Themen 6
S ArrayList<JLabels> "malen" Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben