407 Stimmen

Kopie eines Arrays erstellen

Ich habe ein Array a die ständig aktualisiert wird. Sagen wir a = [1,2,3,4,5] . Ich muss ein exaktes Duplikat von a und nennen es b . Wenn a zu ändern wären [6,7,8,9,10] , b sollte noch sein [1,2,3,4,5] . Wie kann ich dies am besten tun? Ich habe versucht, eine for Schleifen wie:

for(int i=0; i<5; i++) {
    b[i]=a[i];
}

aber das scheint nicht richtig zu funktionieren. Bitte verwenden Sie keine fortgeschrittenen Begriffe wie "deep copy" usw., denn ich weiß nicht, was das bedeutet.

633voto

Bala R Punkte 104615

Sie können versuchen, mit System.arraycopy()

int[] src  = new int[]{1,2,3,4,5};
int[] dest = new int[5];

System.arraycopy( src, 0, dest, 0, src.length );

Aber wahrscheinlich ist es in den meisten Fällen besser, clone() zu verwenden:

int[] src = ...
int[] dest = src.clone();

246voto

MeBigFatGuy Punkte 27784

Können Sie

int[] a = new int[]{1,2,3,4,5};
int[] b = a.clone();

auch.

200voto

Evgeniy Dorofeev Punkte 129020

Wenn Sie eine Kopie davon machen wollen:

int[] a = {1,2,3,4,5};

Das ist der richtige Weg:

int[] b = Arrays.copyOf(a, a.length);

Arrays.copyOf kann schneller sein als a.clone() auf kleinen Arrays. Beide kopieren Elemente gleich schnell, aber clone() gibt Object daher muss der Compiler einen impliziten Cast nach int[] . Sie können es im Bytecode sehen, etwa so:

ALOAD 1
INVOKEVIRTUAL [I.clone ()Ljava/lang/Object;
CHECKCAST [I
ASTORE 2

68voto

Kanagavelu Sugumar Punkte 17711

Nette Erklärung von http://www.journaldev.com/753/how-to-copy-arrays-in-java

Java Array-Kopiermethoden

Object.clone() : Die Klasse Object bietet die Methode clone() und da Array in Java auch ein Objekt ist, können Sie diese Methode verwenden, um eine vollständige Array zu kopieren. Diese Methode ist nicht geeignet, wenn Sie eine Teilkopie von des Arrays wünschen.

System.arraycopy() : Die Systemklasse arraycopy() ist der beste Weg, um partielle Kopie eines Arrays. Sie bietet Ihnen Gesamtzahl der zu kopierenden Elemente sowie die Quell- und Ziel-Array Index-Positionen. Zum Beispiel System.arraycopy(Quelle, 3, Ziel, 2, 5) kopiert 5 Elemente von der Quelle zum Zielort 3. Index der Quelle zum 2. Index des Ziels.

Arrays.copyOf(): Wenn Sie die ersten paar Elemente eines a vollständige Kopie eines Arrays, können Sie diese Methode verwenden. Offensichtlich ist es nicht vielseitig wie System.arraycopy(), aber sie ist auch nicht verwirrend und einfach zu verwenden.

Arrays.copyOfRange() : Wenn nur wenige Elemente eines Arrays kopiert werden sollen kopiert werden sollen, bei denen der Startindex nicht 0 ist, können Sie diese Methode zum Kopieren Teil-Array kopieren.

37voto

Stephen C Punkte 665668

Ich habe das Gefühl, dass all diese "besseren Möglichkeiten, ein Array zu kopieren", Ihr Problem nicht wirklich lösen werden.

Sie sagen

Ich habe eine for-Schleife wie [...] versucht, aber das scheint nicht richtig zu funktionieren?

Wenn man sich diese Schleife ansieht, gibt es kein offensichtlicher Grund dass es nicht funktioniert ... es sei denn:

  • Sie haben irgendwie die a y b Arrays durcheinander gebracht (z.B. a y b auf das gleiche Array verweisen), oder
  • Ihre Anwendung wird von mehreren Threads durchlaufen und verschiedene Threads lesen und aktualisieren die a Array gleichzeitig.

In beiden Fällen lösen alternative Kopierverfahren das eigentliche Problem nicht.

Die Lösung für das erste Szenario ist offensichtlich. Für das zweite Szenario müssen Sie eine Möglichkeit zur Synchronisierung der Threads finden. Atomare Array-Klassen helfen nicht, da sie keine atomaren Kopierkonstruktoren oder Klon-Methoden haben, aber die Synchronisierung mit einem primitiven Mutex wird den Trick erfüllen.

(Es gibt Hinweise in Ihrer Frage, die mich vermuten lassen, dass dies tatsächlich mit dem Thema zusammenhängt; z. B. Ihre Aussage, dass a ändert sich ständig).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X