ArrayList - Objekt kopieren und ändern

mace

Mitglied
Hallo zusammen,
Es ist eigentlich ganz simpel: Ich möchte ein bestehendes Objekt in einer ArrayList duplizieren (der ArrayList am Ende anfügen) und die Kopie ändern.
Aus irgendeinem Grund wird jedoch bei der Änderung des neuen Objekts auch das Ursprungsobjekt geändert. Woran liegt das bzw. wie kann ich das vermeiden?

Danke im Voraus & Grüße!

Java:
sequence = sequence + 1;

opShapeData.add(opShapeData.get(selectedActivityIndex));
shape shape = new shape();
shape = opShapeData.get(sequence - 1); // - 1 da sequence bei 1 startet und selectedActivityIndex bei 0
shape.setSequence(sequence);
shape.setId("New Id");
opShapeData.set(sequence - 1, shape);
Die ArrayList verwende ich als ObservableList in einem Javafx-Tableview. Die Kopie soll logischerweise vom aktuell selektierten Element (selectedActivityIndex) erzeugt werden.

Ergebnis:
Code:
----- No.: 0 | sequence: 2 | Id: New Id
----- No.: 1 | sequence: 2 | Id: New Id
 

temi

Top Contributor
Vermutlich erzeugst du keine Kopie, sondern kopierst nur die Referenz auf das ursprüngliche Objekt, damit hast du dann zwei Variablen, die auf das selbe Objekt zeigen.

BTW: Klassennamen sollten groß geschrieben werden, Variablennamen klein: shape shape = new shape(); kann gar nicht funktionieren.
 

mace

Mitglied
Ja, das mit der Referenz habe ich mir schon gedacht. Leider finde ich nichts zum Kopieren von einzelnen Elementen einer ArrayList, nur zum Kopieren von ganzen ArrayLists. Über einen Hinweis, wie ich es richtig mache, wäre ich sehr dankbar.

Auch danke für den Hinweis mit den Klassennamen. Hat bisher glücklicherweise funktioniert.
 

temi

Top Contributor
Leider finde ich nichts zum Kopieren von einzelnen Elementen einer ArrayList

Es geht weniger um die ArrayList, sondern um den Typ der darin gespeichert ist. Den musst du kopieren.

Viele Klassen bieten einen Kopierkonstruktor an
Java:
Rectangle rect1 = new Rectangle();
Rectangle rect2 = new Rectangle(rect1); // Kopie von rect1

Generell, würde ich zuerst das Objekt aus der Liste holen, verändern und danach in der Liste speichern.
Java:
Shape shape = new Shape(opShapeData.get(selectedActivityIndex)); // Ich weiß nicht was Shape ist und ob es einen Kopierkonstuktor gibt
shape.setSequence(sequence);
shape.setId("New Id");
opShapeData.add(shape);

Vielleicht wird auch clone() unterstützt?
Java:
Shape shape = opShapeData.get(selectedActivityIndex).clone();
 

mace

Mitglied
Erst einmal danke für den Hinweis. Die Klasse Shape habe ich selbst erstellt. Aus den Shapes werden in einer anderen Funktion SVG-Grafiken erstellt. Ich werde mal schauen, ob ich selbst eine Methode zum Kopieren hinbekomme. Klingt elegant und ich werde es noch öfter benötigen.
 

temi

Top Contributor
Erst einmal danke für den Hinweis. Die Klasse Shape habe ich selbst erstellt. Aus den Shapes werden in einer anderen Funktion SVG-Grafiken erstellt. Ich werde mal schauen, ob ich selbst eine Methode zum Kopieren hinbekomme. Klingt elegant und ich werde es noch öfter benötigen.

Schreib dir einen Kopierkonstruktor, der ein Shape als Parameter hat und von diesem die Eigenschaften übernimmt.
 

mace

Mitglied
Da ich gelesen habe, dads jeder Java-Anfänger irgendwann auf das Thema trifft, anbei meine Lösung.
Das Thema des Kopierens von Objekten ist nicht trivial. Wie Temi schreibt, erstellt man in den meisten Fällen keine Kopie sondern nur eine Referenz auf denselben Speicherbereich, was dazu führt, dass altes und neues Objekt quasi verbunden bleiben. Die Stichworte sind Shallow copy bzw. Deep copy. Benötigt man eigenständige Kopie, ist Deep copy die richtige Wahl. Auch dafür gibt es verschiedene Varianten.

Diese Links haben mir geholfen:
https://www.programmingmitra.com/20...nstructor-versus-Object-clone-or-cloning.html
https://www.codevscolor.com/java-deepcopy-serializationutils-example/

Java:
sequence = sequence + 1;

Shape oldShape = opShapeData.get(selectedActivityIndex);
Shape newShape = SerializationUtils.clone(oldShape);

newShape.setSequence(sequence - 1);

opShapeData.add(newShape);

Die Objektklasse muss dafür Serializable implementieren.

Java:
public class Shape implements Serializable {
...

Danke an Temi für den richtigen Hinweis.
 

mrBrown

Super-Moderator
Mitarbeiter
Du hast damit die so ziemlich umständlichste Lösung gefunden, das ist durch die Brust dann durch den Zeh und dann ins Auge :)

Ein einfacher Copy-Konstruktor ist da die einfachste und beste Variante. (Und trivial ist der auch ;) )
 

mace

Mitglied
Hmm, ein Java-Nicht-Anfänger teilt in einem Java-Anfänger-Bereich einem Java-Anfänger mit, was trivial ist und was nicht. Nun, Überraschung: Trivial oder nicht hängt doch arg von der Perspektive ab. Mein 6-Jähriger Sohn kann mir sicher auch Integralrechnung erklären, weil er schon 1+1 rechnen kann. Diesen supereinfachen Copy-Konstruktor habe ich jedenfalls nicht auf Anhieb hinbekommen und der Autor des Artikel im ersten Link wird sicherlich auch keine Ahnung haben (vor allem kann ich das als Anfänger gut beurteilen). Aber danke für den lehrreichen Kommentar.
 

mrBrown

Super-Moderator
Mitarbeiter
Hmm, ein Java-Nicht-Anfänger teilt in einem Java-Anfänger-Bereich einem Java-Anfänger mit, was trivial ist und was nicht. Nun, Überraschung: Trivial oder nicht hängt doch arg von der Perspektive ab. Mein 6-Jähriger Sohn kann mir sicher auch Integralrechnung erklären, weil er schon 1+1 rechnen kann. Diesen supereinfachen Copy-Konstruktor habe ich jedenfalls nicht auf Anhieb hinbekommen und der Autor des Artikel im ersten Link wird sicherlich auch keine Ahnung haben (vor allem kann ich das als Anfänger gut beurteilen). Aber danke für den lehrreichen Kommentar.

Ein Copy-Konstruktor nutzt nur die absoluten Java-Grundlagen: Konstruktoren und Zuweisungen. Um bei deinem Beispiel zu bleiben: Das ist auf dem Nivea von 1+1.

Deine Variante (bzw die beiden Varianten aus deinen Links) nutzen clone und Serialisierung. Beide Konzepte sind große Fehler von Java und führen ständig zu Problemen, sowohl aufgrund ihrer konkreten Umsetzung (mit Marker-Interfaces statt richtigen Interfaces), als auch aufgrund des Konzepts.
Clone wäre dabei sogar noch passend, wenn man ein Objekt "klonen" will - Serialisierung zu nutzen ist aber wirklich ein Umweg um drei Ecken, und eher auf dem Niveau der Integralrechnung.

In beiden Fällen ist aber ein Copy-Konstruktor deutlich einfacher.

Um das mal gegenüber zu stellen:

Das ist der Copy-Konstrukutor aus deinem ersten Link in sinnvoll:
Java:
public Person(Person original) {
    this.id = original.id + 1;
    this.name = original.name;
    this.city = original.city;
}

Alles, was da drin vor kommt ist eine Konstruktor-Deklaration und drei Zuweisungen - beides nicht wirklich kompliziert und für jeden Einsteiger der schon Konstruktoren kennt verständlich.



Das dagegen ist der Weg über Serialisierung:

Java:
class Person implements Serializable {...}

public Person copy(Person original) throws IOException, ClassNotFoundException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(bos);
    out.writeObject(original);

    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
    ObjectInputStream in = new ObjectInputStream(bis);
    return (Person) in.readObject();
}

Statt einem Konstruktor mit drei Zuweisungen muss man:
* Interfaces kennen
* Exceptions kennen
* grundsätzlich Input/Output-Streams verstanden haben
** Wrappen von Streams verstanden haben
** ByteArray*Stream kennen
** Object*Stream kennen
* Casten verstanden haben
* und nutzt zusätzlich eine API mit X Fallstricken und Beschränkungen.
 

temi

Top Contributor
Diesen supereinfachen Copy-Konstruktor habe ich jedenfalls nicht auf Anhieb hinbekommen
Ich hatte doch dazu geschrieben wie es geht
Kopierkonstruktor, der ein Shape als Parameter hat und von diesem die Eigenschaften übernimmt

Du hättest auch gerne noch mal nachfragen dürfen, wenn noch etwas unklar war. Wobei sogar bei deinem ersten Link wird ziemlich weit unten erwähnt, dass der Kopierkonstruktor der beste Weg ist, inkl. Beispiel.
Copy Constructors
This method copying object is most popular between developer community it overcomes every design issue of Object.clone() and provides better control over object construction
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Objekt aus Arraylist in andere Arraylist kopieren? Java Basics - Anfänger-Themen 2
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
L Objekt aus Textdatei in ArrayList speichern Java Basics - Anfänger-Themen 4
CptK Datentypen Objekt lässt sich nicht zu arraylist hinzufügen Java Basics - Anfänger-Themen 2
C Bestimmtes Objekt einer ArrayList in einer Methode selektieren Java Basics - Anfänger-Themen 8
D ArrayList mit eigenem Objekt Java Basics - Anfänger-Themen 6
T Von einer Methode zurückgegebenes Objekt in einer ArrayList ansprechen Java Basics - Anfänger-Themen 5
W Nullpointer bei Objekt Serialisierung mit ArrayList<byte[]> etc. Java Basics - Anfänger-Themen 2
J ArrayList Objekt löschen Java Basics - Anfänger-Themen 6
J ArrayList nimmt ständig nur das letzte Objekt auf Java Basics - Anfänger-Themen 2
J Datentypen Objekt aus ArrayList sinnvoll übergeben Java Basics - Anfänger-Themen 9
J Zuordnung von Variablen einem ArrayList-Objekt Java Basics - Anfänger-Themen 18
philipp Auf Objekt einer ArrayList zugreifen Java Basics - Anfänger-Themen 2
G ArrayList mit eigenem Objekt füllen Java Basics - Anfänger-Themen 7
C Arraylist mit string array oder hashmap oder objekt? Java Basics - Anfänger-Themen 5
M Der Umgang mit Iterator - Wie ein Objekt aus einer ArrayList Java Basics - Anfänger-Themen 2
R ArrayList Objekt -> verkettete Liste Java Basics - Anfänger-Themen 4
M ArrayList mit Objekt vom Typ GregorianCalendar Java Basics - Anfänger-Themen 3
krgewb ArrayList allgemein halten Java Basics - Anfänger-Themen 6
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
E Arrays in einer ArrayList miteinander vergleichen Java Basics - Anfänger-Themen 12
String in ArrayList umwandeln Java Basics - Anfänger-Themen 1
F Arraylist<String>Ein Wort pro Zeile Java Basics - Anfänger-Themen 6
J ArrayList vergleichen im spiel Mastermind Java Basics - Anfänger-Themen 2
Mugetsu35 ArrayList Update ohne Index Java Basics - Anfänger-Themen 6
W Objekte einer ArrayList in txt-datei schreiben mit Paths? Java Basics - Anfänger-Themen 2
Z Java ArrayList speichert falsche Daten ab bzw. gibt falsche Daten aus? Java Basics - Anfänger-Themen 42
W if-Abfrage bei ArrayList-Methodenaufrufen - Wie löse ich das? Java Basics - Anfänger-Themen 6
W ArrayList und toString Java Basics - Anfänger-Themen 17
volcanos Addition -> List<Integer> mit Arrays.asList() versus List<Integer>ArrayList<>() Java Basics - Anfänger-Themen 14
ArrayList mit unbekannter Menge an Arrays die Arrays vergleichen Java Basics - Anfänger-Themen 9
M 2d ArrayList durchgehen Java Basics - Anfänger-Themen 2
Blkckroll45 Arraylist Java Basics - Anfänger-Themen 6
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
berserkerdq2 Geht collections.sort bei allen? Linkedhashset, ArrayList, HashSet etc. Java Basics - Anfänger-Themen 4
R Methoden Werte einer ArrayList als Parameter übergeben. Java Basics - Anfänger-Themen 4
L Dauerhaftes Speichern einer Eingabe bei einer ArrayList Java Basics - Anfänger-Themen 26
D Arraylist mit Komplexen Datentyp Java Basics - Anfänger-Themen 3
H Kompliziertes Sortieren einer ArrayList mit Objekten(Sortieren nach X und Y) Java Basics - Anfänger-Themen 11
T Permanentes speichern von Objekten in einer ArrayList Java Basics - Anfänger-Themen 6
volcanos List & ArrayList nach Familiennamen abfragen Java Basics - Anfänger-Themen 57
M static ArrayList in non-static Java Basics - Anfänger-Themen 12
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
M ArrayList<TreeNode<T>> fortlaufende Nummerierung der Elemente Java Basics - Anfänger-Themen 5
B Bungeecord | ProxiedPlayer wird nicht in ArrayList hinzugefügt Java Basics - Anfänger-Themen 1
S ArrayList Username und passwort mit JTextField eingaben abgleichen Java Basics - Anfänger-Themen 10
F Werte in einer Arraylist Zählen Java Basics - Anfänger-Themen 2
F Erste Schritte Zahlenreihe von Arraylist in 3erBlöcke sortiert in neue Arraylist Java Basics - Anfänger-Themen 2
M ArrayList mit einer Schleife befüllen Java Basics - Anfänger-Themen 2
F Methode ArrayList mit Eingabewert Java Basics - Anfänger-Themen 2
J ArrayList add methode selbst programmieren Java Basics - Anfänger-Themen 10
K Erste Schritte Wie schnell ist LinkedHashMap im Vergleich zur ArrayList, wenn alle Entries durchlaufen werden? Java Basics - Anfänger-Themen 47
thobren jtable arraylist Java Basics - Anfänger-Themen 12
N Exception beim Verwenden von Arraylist? Java Basics - Anfänger-Themen 10
P Schiebefix - ArrayList überschreibt Daten Java Basics - Anfänger-Themen 3
Zeppi OOP ArrayList Java Basics - Anfänger-Themen 2
P ArrayList Java Basics - Anfänger-Themen 4
L ArrayList auf 4 Elemente begrenzen Java Basics - Anfänger-Themen 56
C ArrayList sortieren nach bestimmten Buchstaben in den Wörtern Java Basics - Anfänger-Themen 13
S Arraylist<Object> mit verschiedenen Objects ausgeben Java Basics - Anfänger-Themen 3
J ArrayList auf bereits vorhanden eintrag prüfen Java Basics - Anfänger-Themen 5
M For Schleife/ArrayList Java Basics - Anfänger-Themen 12
L ArrayList<String> --> double[] array Java Basics - Anfänger-Themen 18
L Längstes Element einer ArrayList ausgeben Java Basics - Anfänger-Themen 9
S Aus verschachtelter ArrayList auf einen Wert zugreifen Java Basics - Anfänger-Themen 4
L Methoden ArrayList Werte hinzufügen und löschen Java Basics - Anfänger-Themen 32
M ArrayList in GUI ausgeben Java Basics - Anfänger-Themen 1
J Nur bestimmter Typ aus der ArrayList ausgeben. Java Basics - Anfänger-Themen 9
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
Bademeister007 Operatoren Alle Zahlen einer ArrayList die durch 5 teilbar ist Java Basics - Anfänger-Themen 2
C Sortieren einer ArrayList Java Basics - Anfänger-Themen 2
krgewb ArrayList von ArrayList Java Basics - Anfänger-Themen 2
R ArrayList Problem Java Basics - Anfänger-Themen 6
jonny_2k12 Wie kann ich eine ArrayList aus einer Klasse in eine andere übergeben? Java Basics - Anfänger-Themen 21
O Namen (mit Umlauten und ß) in einer ArrayList suchen Java Basics - Anfänger-Themen 5
N Typebound Objekte einer Arraylist hinzufügen Java Basics - Anfänger-Themen 7
R Methoden ArrayList clonen wirft exception Java Basics - Anfänger-Themen 3
S ArrayList in andere Klasse übernhemen Java Basics - Anfänger-Themen 5
M Letztes Element einer ArrayList Java Basics - Anfänger-Themen 12
B Objektverwaltung mit ArrayList in einer seperaten Klasse Java Basics - Anfänger-Themen 24
I Sortiert eine HashMap nicht gleich wie eine ArrayList? Java Basics - Anfänger-Themen 1
I ArrayList erstellen innerhalb einer Zeile? Java Basics - Anfänger-Themen 3
L Iterieren durch eine ArrayList. Integer Array wird übergeben Java Basics - Anfänger-Themen 17
V Collections ArrayList mit Comparator sortieren Java Basics - Anfänger-Themen 16
D Collections Arrays in ArrayList abspeichern Java Basics - Anfänger-Themen 6
F java.util.ArrayList Java Basics - Anfänger-Themen 3
M Zugriff auf eine ArrayList in einer anderen Klasse Java Basics - Anfänger-Themen 4
P Arraylist zu einem Array bringen mit Verschachtelung Java Basics - Anfänger-Themen 11
N Methode mit einer Arraylist Java Basics - Anfänger-Themen 106
I ArrayList - Methode zum Speichern eines Eintrags in einer Datei Java Basics - Anfänger-Themen 17
H ArrayList Java Basics - Anfänger-Themen 7
D public ArrayList(Collection<? extends E> c); Java Basics - Anfänger-Themen 2
M JTextField in ArrayList speichern Java Basics - Anfänger-Themen 4
C ArrayList mit return zurückgeben Java Basics - Anfänger-Themen 13
K Zahlenfolge ArrayList Java Basics - Anfänger-Themen 3
C Erste Schritte Frage zur ArrayList Java Basics - Anfänger-Themen 15
I Klassen Eine ArrayList<Long>, die sich automatisch sortiert Java Basics - Anfänger-Themen 20
F Array in ArrayList ablegen Java Basics - Anfänger-Themen 3
V ArrayList Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben