System.arraycopy 和 Array.clone 的比較
阿新 • • 發佈:2018-05-01
%s 類型 arraycopy 復制類型 print () family 哈哈 cor
1 /** 2 * 復制功能更測試 3 */ 4 public static void main01(String[] args) { 5 String[] array01 = new String[]{"01", "02", "03"}; 6 String[] array02 = array01.clone(); 7 System.out.println(array01); 8 System.out.println(array02); 9 array02[1] = "將哈哈哈哈"; 10 array02[2] = null; 11 System.out.println(Arrays.toString(array01)); 12 System.out.println(Arrays.toString(array02)); 13 14 /* 15 ->輸出: 16 [Ljava.lang.String;@16acdd1 17 [Ljava.lang.String;@ee6681 18 [01, 02, 03] 19 [01, 將哈哈哈哈, null] 20 */ 21 }22 23 /** 24 * 對象類型的元素拷貝速度測試 25 */ 26 public static void main02(String[] args) { 27 String[] array01 = new String[]{"01", "02", "03"}; 28 long begin = System.nanoTime(); 29 for (int i = 0; i < 100000000; i++) { 30 // String[] array02 = array01.clone(); 31 String[] array02 = newString[array01.length]; 32 System.arraycopy(array01, 0, array02, 0, array01.length); 33 } 34 long end = System.nanoTime(); 35 System.out.println(end - begin); 36 37 /* 38 ->輸出: 39 使用 array.clone(): 40 13189919392 41 使用 System.arraycopy(): 42 1689826432 43 */ 44 } 45 46 /** 47 * 基本數據類型的元素拷貝速度測試 48 */ 49 public static void main03(String[] args) { 50 int[] array01 = new int[]{01, 02, 03}; 51 long begin = System.nanoTime(); 52 for (int i = 0; i < 100000000; i++) { 53 int[] array02 = array01.clone(); 54 // int[] array02 = new int[array01.length]; 55 // System.arraycopy(array01, 0, array02, 0, array01.length); 56 } 57 long end = System.nanoTime(); 58 System.out.println(end - begin); 59 60 /* 61 ->輸出: 62 使用 array.clone(): 63 12566117948 64 使用 System.arraycopy(): 65 1488130581 66 */ 67 } 68 69 /** 70 * 對象拷貝內容測試 71 */ 72 public static void main(String[] args) { 73 Object[] array01 = new Object[]{new Object(), new Object(), new Object()}; 74 Object[] array02 = array01.clone(); 75 System.out.format("%s->%s\n", array01, Arrays.toString(array01)); 76 System.out.format("%s->%s\n", array02, Arrays.toString(array02)); 77 78 array02 = new Object[array01.length]; 79 System.arraycopy(array01, 0, array02, 0, array01.length); 80 System.out.format("%s->%s\n", array01, Arrays.toString(array01)); 81 System.out.format("%s->%s\n", array02, Arrays.toString(array02)); 82 83 /* 84 ->輸出: 85 [Ljava.lang.Object;@a0864f->[java.lang.Object@facf0b, java.lang.Object@2f0df1, java.lang.Object@13c6a22] 86 [Ljava.lang.Object;@d1e233->[java.lang.Object@facf0b, java.lang.Object@2f0df1, java.lang.Object@13c6a22] 87 [Ljava.lang.Object;@a0864f->[java.lang.Object@facf0b, java.lang.Object@2f0df1, java.lang.Object@13c6a22] 88 [Ljava.lang.Object;@15983b7->[java.lang.Object@facf0b, java.lang.Object@2f0df1, java.lang.Object@13c6a22] 89 */ 90 }
測試結果:
1、拷貝功能:
array.clone 和 System.arraycopy 都可以實現數組引用區的完全復制。對復制後的新數組的引用區進行操作不影響原數組引用區內容
(引用區指的是:對象的指針列表)。
2、拷貝速度:
當復制類型無論為對象類型還是基本數據:
System.arraycopy() 的速度都是 array.clone()的9-10倍。
3、對象內容拷貝測試:
System.arraycopy() 和 array.clone() 都是引用區拷貝,不拷貝元素對象。
總結:
System.arraycopy() 和 array.clone()實現功能一致,但System.arraycopy()更快速,另外System.arraycopy()也經常用於數組擴容。
System.arraycopy 和 Array.clone 的比較