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 = new String[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()也经常用于数组扩容。