Während System.arraycopy
es nativ implementiert ist und daher 1 schneller als eine Java-Schleife sein könnte, ist es nicht immer so schnell, wie Sie es vielleicht erwarten. Betrachten Sie dieses Beispiel:
Object[] foo = new Object[]{...};
String[] bar = new String[foo.length];
System.arraycopy(foo, 0, bar, 0, bar.length);
In diesem Fall haben die Arrays foo
und die bar
Arrays unterschiedliche Basistypen. Daher muss bei der Implementierung von arraycopy
der Typ jeder kopierten Referenz überprüft werden, um sicherzustellen, dass es sich tatsächlich um eine Referenz auf eine String-Instanz handelt. Das ist deutlich langsamer als ein einfacher C-Stil memcopy
des Array-Inhalts.
Der andere Punkt ist , dass Arrays.copyOf
Anwendungen System.arraycopy
unter der Motorhaube. Daher System.arraycopy
ist auf den ersten Blick nicht langsamer 2 als Arrays.copyOf
. Aber man kann (aus dem Code zitiert siehe oben ) , dass Arrays.copyOf
in einigen Fällen eine Reflexion verwenden Sie das neue Array zu erstellen. Der Leistungsvergleich ist also nicht einfach.
Diese Analyse weist einige Mängel auf.
Wir betrachten den Implementierungscode einer bestimmten Java-Version. Diese Methoden können sich ändern und frühere Annahmen zur Effizienz ungültig machen.
Wir ignorieren die Möglichkeit, dass der JIT-Compiler eine clevere Spezialfalloptimierung für diese Methoden durchführen könnte. Und es passiert anscheinend mit Arrays.copyOf
; Siehe Warum ist Arrays.copyOf für kleine Arrays 2-mal schneller als System.arraycopy? . Diese Methode ist in Java-Implementierungen der aktuellen Generation "intrinsisch", was bedeutet, dass der JIT-Compiler ignoriert, was im Java-Quellcode enthalten ist!
In beiden Fällen ist der Unterschied zwischen den beiden Versionen O(1)
(dh unabhängig von der Arraygröße) relativ gering. Daher würde ich raten, die Version zu verwenden, mit der Ihr Code am einfachsten zu lesen ist, und sich nur darum zu kümmern, welche schneller ist, wenn die Profilerstellung Ihnen sagt, dass dies wichtig ist.
1 - Es könnte schneller sein, aber es ist auch möglich, dass der JIT-Compiler eine handcodierte Schleife so gut optimiert, dass es keinen Unterschied gibt.