System.arraycopy 和 Array.clone 的比较

 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()也经常用于数组扩容
posted @ 2018-05-01 13:48  cnfanghj  阅读(835)  评论(0编辑  收藏  举报