Ich habe ein Array, a
das ständig aktualisiert wird. Sagen wir mal a = [1,2,3,4,5]
. Ich muss eine exakte Kopie davon erstellen a
und sie aufrufen b
. Wenn a
sich ändern sollte [6,7,8,9,10]
, b
sollte es immer noch sein [1,2,3,4,5]
. Was ist der beste Weg, dies zu tun? Ich habe versucht, eine for
Schleife 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., da ich nicht weiß, was das bedeutet.
System.arraycopy
, werden Sie feststellen , dass die Methode verschiedene Dinge überprüfen muss, bevor sie startet. Einige dieser Überprüfungen sind bei einer Kopierschleife abhängig von den statischen Array-Typen nicht erforderlich.clone()
erweist es sich als die schnellste für 250 000 Elemente.src.clone()
besser lesbar ist und weitaus weniger Fehlerquellen bietet als das Zuweisen eines neuen Arrays und das Ausführenarraycopy
. (Und ist auch schnell.)Sie können verwenden
auch.
quelle
Wenn Sie eine Kopie erstellen möchten von:
Dies ist der richtige Weg:
Arrays.copyOf
kann schneller sein alsa.clone()
auf kleinen Arrays. Beide Kopierelemente sind gleich schnell, aber clone () gibt zurück,Object
sodass der Compiler eine implizite Umwandlung in einfügen mussint[]
. Sie können es im Bytecode sehen, ungefähr so:quelle
Schöne Erklärung von http://www.journaldev.com/753/how-to-copy-arrays-in-java
Java-Array-Kopiermethoden
quelle
Ich habe das Gefühl, dass all diese "besseren Möglichkeiten zum Kopieren eines Arrays" Ihr Problem nicht wirklich lösen werden.
Du sagst
Wenn man sich diese Schleife ansieht, gibt es keinen offensichtlichen Grund dafür, dass sie nicht funktioniert ... es sei denn:
a
undb
Arrays irgendwie durcheinander gebracht (z. B.a
undb
beziehen sich auf dasselbe Array), odera
Array gleichzeitig.In beiden Fällen lösen alternative Methoden zum Kopieren das zugrunde liegende Problem nicht.
Die Lösung für das erste Szenario liegt auf der Hand. Für das zweite Szenario müssen Sie eine Möglichkeit zum Synchronisieren der Threads finden. Atomic Array-Klassen helfen nicht, da sie keine Atomic Copy-Konstruktoren oder Klonmethoden haben, aber die Synchronisierung mit einem primitiven Mutex reicht aus.
(Ihre Frage enthält Hinweise, die mich zu der Annahme veranlassen, dass dies tatsächlich mit dem Thread zusammenhängt, z. B. Ihre Aussage, die
a
sich ständig ändert.)quelle
Sie können versuchen, Arrays.copyOf () in Java zu verwenden
quelle
Alle Lösungen, die die Länge des Arrays aufrufen, fügen Sie Ihren Code hinzu.
Ich empfehle Ihnen, das Rad nicht zu erfinden und die Utility-Klasse zu verwenden, in der bereits alle erforderlichen Überprüfungen durchgeführt wurden. Betrachten Sie ArrayUtils von Apache Commons. Ihr Code wird kürzer:
Apache Commons finden Sie dort
quelle
Sie können auch verwenden
Arrays.copyOfRange
.Beispiel :
Diese Methode ähnelt,
Arrays.copyOf
ist jedoch flexibler. Beide verwendenSystem.arraycopy
unter der Haube.Siehe :
quelle
Für eine nullsichere Kopie eines Arrays können Sie auch eine Option mit der
Object.clone()
in dieser Antwort angegebenen Methode verwenden .quelle
Optional
Objekt ist nur ein leeres Objekt mit einem Verweis auf das vorhandene Array. In Bezug auf die Auswirkungen auf die Leistung würde ich sagen, dass es verfrüht ist zu sagen, dass es sich tatsächlich um eine Auswirkung handelt, da diese Art von Konstrukt ein guter Kandidat für das Inlining innerhalb der JVM ist und dann nicht mehr Auswirkungen als andere Methoden hat. Es ist eine Frage des Stils (funktionale Programmierung versus prozedurale Programmierung, aber nicht nur), sie als komplizierter zu betrachten oder nicht.Wenn Sie mit Raw-Arrays arbeiten müssen und nicht,
ArrayList
dannArrays
haben Sie das, was Sie brauchen. Wenn Sie sich den Quellcode ansehen, sind dies die absolut besten Möglichkeiten, um eine Kopie eines Arrays zu erhalten. Sie haben ein gutes Stück defensiver Programmierung, da dieSystem.arraycopy()
Methode viele ungeprüfte Ausnahmen auslöst, wenn Sie unlogische Parameter eingeben.Sie können entweder verwenden
Arrays.copyOf()
, um vom ersten zumNth
Element in das neue kürzere Array zu kopieren .oder
Arrays.copyOfRange()
wird auch den Trick machen:Wie Sie sehen können, sind beide nur Wrapper-Funktionen
System.arraycopy
mit defensiver Logik, dass das, was Sie versuchen, gültig ist.System.arraycopy
ist der absolut schnellste Weg, um Arrays zu kopieren.quelle
Ich hatte ein ähnliches Problem mit 2D-Arrays und endete hier. Ich habe das Hauptarray kopiert und die Werte der inneren Arrays geändert und war überrascht, als sich die Werte in beiden Kopien geändert haben. Grundsätzlich waren beide Kopien unabhängig, enthielten jedoch Verweise auf dieselben inneren Arrays, und ich musste eine Reihe von Kopien der inneren Arrays erstellen, um das zu erhalten, was ich wollte.
Es ist wahrscheinlich nicht das Problem des OP, aber ich hoffe, es kann immer noch hilfreich sein.
quelle