# ArrayList Klonen



## Underworld (23. Jun 2010)

Hallo,

eine kurze Frage. Wie kann man denn eine ArrayList klonen?
Ich habe beim googlen bereits diese Antwort gefunden:
http://www.java-forum.org/java-basi...list-point-neue-arraylist-point-kopieren.html

Ich bräuchte also eine komplett unabhängige Kopie einer ArrayList, scheint also eine "tiefe Kopie" zu sein.

Ich habe diesen Code:

```
ArrayList<test> arrayList;

// und die ArrayList in der die Objekte hineinkopiert werden sollen:

ArrayList<test> klon = new ArrayList<test>();
```

Wenn das ganze nicht zu umständlich ist (d.h. in wenigen Zeilen lösbar), könnte mir das jemand vielleicht kurz abtippen? 

Falls sich das ganze als kompliziert herrausstellt, werde ich auch noch eine andere Lösung finden können (oder besser müssen) !

lg Underworld


----------



## Irreparabel (23. Jun 2010)

Naja, ich denke das kommt immer drauf an, was man kopieren/klonen möchte.
Sagen wir mal du hast eine Klasse Test die im Konstruktor 2 integer erwartet, die in der Klasse als variable1 und variable2 deklariert sind. Die Werte können dann beispielsweise per getVariable1 und getVariable2 zurückgeliefert werden, wenn du jetzt also davon eine Kopie machen möchtest sollte sowas schon reichen:

```
ArrayList<Test> arrayList = new ArrayList<Test>;
ArrayList<Test> klon = new ArrayList<Test>();
for (Test testObjekt : arrayList){
klon.add(new Test(testObjekt.getVariable1(), testObjekt.getVariable2()));
}
```


----------



## Underworld (23. Jun 2010)

Irreparabel hat gesagt.:


> Naja, ich denke das kommt immer drauf an, was man kopieren/klonen möchte.
> Sagen wir mal du hast eine Klasse Test die im Konstruktor 2 integer erwartet, die in der Klasse als variable1 und variable2 deklariert sind. Die Werte können dann beispielsweise per getVariable1 und getVariable2 zurückgeliefert werden, wenn du jetzt also davon eine Kopie machen möchtest sollte sowas schon reichen:
> 
> ```
> ...



hm, leider ist meine test Klasse etwas komplizierter aufgebaut 

Jedes einzelne Objekt zu kopieren, wäre ne heiden Arbeit, die es sicherlich nicht Wert ist.

Gäbe es noch eine andere Möglichkeit?


----------



## Antoras (23. Jun 2010)

Dir wird nichts anderes übrig bleiben als jedes Objekt einzeln zu kopieren:

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

public class ListCloneTest {
	public static void main(String[] args) throws CloneNotSupportedException {
		List<Test> l1 = new ArrayList<Test>();
		List<Test> l2 = new ArrayList<Test>();
		
		for (int i = 0; i < 5; ++i) {
			l1.add(new Test(i));
		}
		for (int i = 0; i < 5; ++i) {
			l2.add(l1.get(i).clone());
		}
		for (int i = 0; i < 5; ++i) {
			System.out.println("l1:" + l1.get(i).i + ", l2: " + l2.get(i).i + ", same obj: " + (l1.get(0)== l2.get(0)));
		}
	}
}

class Test implements Cloneable {
	int i;
	public Test(int i) { this.i = i; }
	@Override
	protected Test clone() throws CloneNotSupportedException {
		return new Test(i);
	}
}
```


----------



## cz3kit (23. Jun 2010)

Verwende doch einfach die clone() Methode. Sieht so aus


```
ArrayList<test> klon = (ArrayList<test>) arraylist.clone()
```

ArrayList implementiert Cloneable, also von daher.
Fertig


----------



## mjdv (23. Jun 2010)

ArrayList.clone() ?


----------



## cz3kit (23. Jun 2010)

Laut API gibt es diese Methode, oder hab ich hier was falsch verstanden?


----------



## Antoras (23. Jun 2010)

Es gibt diese Methode, ja. Aber sie hat zwei Nachteile:

 Sie kann nicht auf das Interface List<...> angewandt werden.
 Sie clont nur die ArrayList, nicht deren Elemente:


			
				http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html#clone%28%29 hat gesagt.:
			
		

> Returns a shallow copy of this ArrayList instance. (The elements themselves are not copied.)


----------



## cz3kit (23. Jun 2010)

Hmm, die sollen ja unabhängig sein voneinander. Bei der Verwendung von clone() sind die das doch, oder irre ich mich gerade?


----------



## Antoras (23. Jun 2010)

Der TO will sowohl die Liste als auch deren Elemente clonen, wenn ich ihn richtig verstanden hab. Bei der clone-Methode von ArrayList wird nur die Liste kopiert, nicht aber deren Elemente.


----------



## cz3kit (23. Jun 2010)

Ah gut, dann hab ich was falsch verstanden.


----------



## Aero (23. Jun 2010)

Geht´s nicht auch mit ArrayList.addAll(Collection<? extends E> c)?

Also so:


```
ArrayList<Test> arrayList = new ArrayList<Test>;
ArrayList<Test> klon = new ArrayList<Test>();

klon.addAll(arrayList);
```


----------



## Antoras (23. Jun 2010)

Nö, da werden auch bloß die Referenzen kopiert. Gib dir mal toString() der Objekte auf der Konsole aus, dann siehst du es.


----------



## eRaaaa (23. Jun 2010)

Was sind denn das jetzt für Objekte in der Liste und vor allem was für Objekte referenzierne die evtl. noch? Hänge an alle das Marker-Interface "Serializable" ran und serialisiere/deserialisiere einfach die Liste und gut ist...oder du musst eben selbst Hand anlegen


----------



## FArt (24. Jun 2010)

eRaaaa hat gesagt.:


> Was sind denn das jetzt für Objekte in der Liste und vor allem was für Objekte referenzierne die evtl. noch? Hänge an alle das Marker-Interface "Serializable" ran und serialisiere/deserialisiere einfach die Liste und gut ist...oder du musst eben selbst Hand anlegen


Nicht ganz. Der Trick den Schlonz zu serialisieren ist gut, das gibt ohne Aufwand einen echten Deep-Clone.
Man kann aber nicht einfach durch hinzufügen von Serializable eine Klasse serialisierbar machen.


----------



## Underworld (24. Jun 2010)

Vielen Dank für die Antworten.

Das ganze scheint ein wenig zu kompliziert zu sein!

Ich werde einen anderen Weg finden!


----------

