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) ); }
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.
No, it does not. When you assign a new object to the "original" array, this does not affect the copy.
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.
Using jmh, I get similar results, except that clone
seems to be marginally better.
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]; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With