为了减少可变性,我们应该使用
public void setValues(String[] newVals) { this.vals = ( newVals == null ? null : newVals.clone() ); }
要么
public void setValues(String[] newVals) { this.vals = ( newVals == null ? null : Arrays.copyOf(newVals, newVals.length) ); }
使用jmh,我得到类似的结果,除了clone似乎稍微好一点。
clone
我对性能进行了一个快速测试:clone,System.arrayCopy并且Arrays.copyOf具有非常相似的性能(jdk 1.7.06,服务器虚拟机)。
System.arrayCopy
Arrays.copyOf
有关详细信息(以毫秒为单位),请在JIT之后:
克隆:68个 数组复制:68个 Arrays.copyOf:68
测试代码:
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]; }