# ArrayList kopieren



## Timo-Beil (9. Mai 2007)

Moin moin!

Ich will eine ArrayList so kopieren, dass die Kopie von der ursprünglichen ArrayList vollständig unabhängig ist. 

Ich habe probiert die ArrayList so zu klonen was aber nicht funktioniert:

ArrayList<Name> neueListe;
neueListe=(ArrayList<Name>) alteListe.clone();


Unter diesem Link http://www.dpunkt.de/java/Programmieren_mit_Java/Streams/9.html#LABOBJECTSTREAMS

(dann ganz unten auf der Seite)

habe ich gelesen, daß man das zu kopierende Objekt mit Streams kopieren soll. Das habe ich so umgesetzt:

```
ArrayList<Name> listeNeu=null;
		ArrayList<Name> listeAlt= new ArrayList<Name>();
		listeAlt.add(new Name("NameNeu"));

		try{
		  // ObjectOutputStream erzeugen
		  ByteArrayOutputStream bufOutStream = new ByteArrayOutputStream();
		  ObjectOutputStream outStream = new ObjectOutputStream(bufOutStream);

		  // Objekt im byte-Array speichern
		  outStream.writeObject(listeAlt);


		  // Pufferinhalt abrufen
		  byte[] buffer = bufOutStream.toByteArray();
		  // ObjectInputStream erzeugen
		  ByteArrayInputStream bufInStream = new ByteArrayInputStream(buffer);
		  ObjectInputStream inStream = new ObjectInputStream(bufInStream);
		  // Objekt wieder auslesen
		  listeNeu = (ArrayList<Name>)inStream.readObject();
		  outStream.close();
		}catch (Exception e){}

		listeAlt.get(0).setName("NameNeu");
		System.out.println(listeNeu.get(0).getName());
```
Das funktioniert aber auch nicht, weil beim kopieren irgendwas falsch läuft. Ich kriege beim "listeNeu.get(0).getName()" eine NullPointerException. 

Hat vielleicht Jemand ein Idee?

Vieln Dank!

Timo


----------



## zerix (9. Mai 2007)

Hallo,

was ist denn bei dir "Name"? Falls dies eine Klasse ist, solltest du dort die Methode clone() überschreiben und dort dann definieren wie ein Objekt von Name kopiert wird. Ich denke das ist der Grund warum clone() auf die ArrayList nicht.

MFG

zEriX


----------



## Timo-Beil (9. Mai 2007)

Die Klasse Name sieht bei mir einfach so aus:

```
public class Name implements Cloneable{

	private String name;

	public Name(String name) {

		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}
```

Ich verstehe nicht ganz wie du das mit dem Überschreiben von der Clone-Methode meinst. Wie würde die denn an meinem Beispiel aussehen?

Danke,

Timo


----------



## zerix (9. Mai 2007)

So würde es bei dir aussehen


```
public class Name implements Cloneable{

  private String name;

  public Name(String name) {

    this.name = name;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  @Override
  protected Name clone()
  {
    return new Name(name);
  }
  
  
}
```

Die Methode clone() ist schon in der Klasse Object definiert. Wenn du dann ein Objekt deiner Klasse kopieren willst, musst du diese Methode überschreiben und sagen wie das Objekt kopiert wird. Grob gesagt du musst ein neues Objekt anlegen in der Methode und dort alle Variablen setzen.
Ich hoffe ich hab mich verständlich ausgedrückt.

MFG

zEriX


----------



## Timo-Beil (9. Mai 2007)

Ich rufe aber doch die clone() Methode der ArrayList auf. Oder muss ich die clone() Methode der Klasse Name dann extra nocheinmal aufrufen?

Wenn ich einfach nur

```
@Override
  protected Name clone()
  {
    return new Name(name);
  }
```
in die Klasse Name einfüge, gehts nicht.

Naja aber ich kann ja auch sonst die Liste mit einer forSchleife oder einem Iterator kopieren.

Danke aber trotzdem

Timo


----------



## zerix (9. Mai 2007)

Ich hab mir jetzt mal die clone-Methode der ArrayList angeschaut. Ich dachte, das dort vielleicht die clone-Methode des Inhaltes aufgerufen wird. Das ist jedoch nicht der Fall.

Naja, jetzt kannst du immerhin in deiner Vorschleife die clone-Methode deiner Klasse verwenden. 

MFG

zEriX


----------

