Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.clone() or Arrays.copyOf()?

In an effort to reduce mutability, should we rather use

public void setValues(String[] newVals) {       this.vals = ( newVals == null ? null : newVals.clone() ); } 

or

public void setValues(String[] newVals) {       this.vals = ( newVals == null ? null : Arrays.copyOf(newVals, newVals.length) ); } 
like image 657
Bruno Grieder Avatar asked Aug 28 '12 10:08

Bruno Grieder


People also ask

What is arrays copyOf?

Arrays. copyOf() method copies specified array into a new array with specified length. If length of new array is greater than that of source array, copyOf() method copies the whole source array to new array and pads the new array with zeros, at end, to match the specified length of new array.

Does arrays copyOf make a deep copy?

No, it does not. When you assign a new object to the "original" array, this does not affect the copy.

What is copyOf in Java?

copyOf(int[] original,int newLength) method copies the specified array, truncating or padding with zeros (if necessary) so the copy has the specified length. For all indices that are valid in both the original array and the copy, the two arrays will contain identical values.


1 Answers

Update using jmh

Using jmh, I get similar results, except that clone seems to be marginally better.

Original post

I ran a quick test for performance: clone, System.arrayCopy and Arrays.copyOf have very similar performance (jdk 1.7.06, server vm).

For details (in ms), after JIT:

clone: 68
arrayCopy: 68
Arrays.copyOf: 68

Test code:

public static void main(String[] args) throws InterruptedException,         IOException {     int sum = 0;     int[] warmup = new int[1];     warmup[0] = 1;     for (int i = 0; i < 15000; i++) { // triggers JIT         sum += copyClone(warmup);         sum += copyArrayCopy(warmup);         sum += copyCopyOf(warmup);     }      int count = 10_000_000;     int[] array = new int[count];     for (int i = 0; i < count; i++) {         array[i] = i;     }      // additional warmup for main     for (int i = 0; i < 10; i++) {         sum += copyArrayCopy(array);     }     System.gc();     // copyClone     long start = System.nanoTime();     for (int i = 0; i < 10; i++) {         sum += copyClone(array);     }     long end = System.nanoTime();     System.out.println("clone: " + (end - start) / 1000000);     System.gc();     // copyArrayCopy     start = System.nanoTime();     for (int i = 0; i < 10; i++) {         sum += copyArrayCopy(array);     }     end = System.nanoTime();     System.out.println("arrayCopy: " + (end - start) / 1000000);     System.gc();     // copyCopyOf     start = System.nanoTime();     for (int i = 0; i < 10; i++) {         sum += copyCopyOf(array);     }     end = System.nanoTime();     System.out.println("Arrays.copyOf: " + (end - start) / 1000000);     // sum     System.out.println(sum); }  private static int copyClone(int[] array) {     int[] copy = array.clone();     return copy[copy.length - 1]; }  private static int copyArrayCopy(int[] array) {     int[] copy = new int[array.length];     System.arraycopy(array, 0, copy, 0, array.length);     return copy[copy.length - 1]; }  private static int copyCopyOf(int[] array) {     int[] copy = Arrays.copyOf(array, array.length);     return copy[copy.length - 1]; } 
like image 127
assylias Avatar answered Oct 09 '22 02:10

assylias