Frage Unterschied zwischen verschiedenen Array-Kopiermethoden


Was ist der Unterschied zwischen

  • System.arraycopy(),
  • clone()
  • Manuelles Kopieren durch Iterieren der Elemente
  • Arrays.copyOf() 
  • und einfach machen arraynew = arrayold?

19
2017-11-08 17:28


Ursprung


Antworten:


  • System.arraycopy() verwendet JNI (Java Native Interface) zum Kopieren ein Array (oder Teile davon), so ist es blitzschnell, wie du bestätigen kannst Hier;
  • clone() erstellt ein Neu Array mit den gleichen Eigenschaften wie das alte Array, d. h. gleiche Größe, gleicher Typ und gleich Inhalt. Beziehen auf Hier für einige Beispiele von clone in Aktion;
  • manual copying ist, nun, manuelles Kopieren. Es gibt nicht viel zu sagen über diese Methode, außer dass viele Leute es am meisten gefunden haben performant.
  • arraynew = arrayold  nicht Kopiere das Array; es gerade Punkte  arraynew an die Speicheradresse von arrayold oder, mit anderen Worten, Sie vergeben einfach ein Referenz zu dem alten Array.

22
2017-11-08 17:36



  • System.arraycopy() Kopiert Daten von einem bestehenden Array in ein anderes und kopiert abhängig von den Argumenten nur Teile davon.
  • clone() weist ein neues Array zu, das denselben Typ und dieselbe Größe wie das Original hat, und stellt sicher, dass es denselben Inhalt hat.
  • Manuelles Kopieren macht normalerweise ziemlich genau dasselbe System.arraycopy(), ist aber mehr Code und daher eine größere Fehlerquelle
  • arraynew = arrayold kopiert nur den Verweis auf das Array auf eine neue Variable und beeinflusst das Array selbst nicht

Es gibt noch eine weitere nützliche Option:

Arrays.copyOf() kann verwendet werden, um eine Kopie eines anderen Arrays mit einer anderen Größe zu erstellen. Dies bedeutet, dass das neue Array größer oder größer als das ursprüngliche Array sein kann und dass der Inhalt der gemeinsamen Größe dem der Quelle entspricht. Es gibt sogar eine Version, die es ermöglicht, ein Array eines anderen Typs zu erstellen, und eine Version, in der Sie einen Bereich von zu kopierenden Elementen angeben können (Array.copyOfRange()).

Beachten Sie, dass alle diese Methoden flache Kopien erstellen. Das bedeutet, dass nur die in den Arrays gespeicherten Referenzen kopiert und die referenzierten Objekte sind nicht dupliziert.


13
2017-11-08 17:43



Arrays.copyOf (..) verwendet intern die Methode System.arrayCopy (..).


5
2018-04-01 05:18



Es gibt Antworten, aber keine vollständige.

Die betrachteten Optionen sind

  • Arrays.copyOf ()
  • System.arraycopy ()

Unten ist die Java-Implementierung von Arrays.copyOf ()

public static double[] More ...copyOf(double[] original, int newLength) {
        double[] copy = new double[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
   }

Wie Sie sehen können, verwendet copyOf intern System.arraycopy.

  • Wenn Sie bereits ein Array erstellt haben, verwenden Sie System.arraycopy () Kopieren
  • Wenn Sie das Ergebnis in einem neuen Array benötigen, verwenden Sie Arrays.copyOf () Kopieren

Hinweis: Es macht keinen Sinn, die Geschwindigkeit offensichtlich zu vergleichen, weil sich ihre Funktionalitäten unterscheiden.


0
2017-10-21 08:33