System.arraycopy 和 Array.clone 的比较
Posted 2014fhj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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->[[email protected], [email protected], [email protected]] 86 [Ljava.lang.Object;@d1e233->[[email protected], [email protected], [email protected]] 87 [Ljava.lang.Object;@a0864f->[[email protected], [email protected], [email protected]] 88 [Ljava.lang.Object;@15983b7->[[email protected], [email protected], [email protected]] 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 的比较的主要内容,如果未能解决你的问题,请参考以下文章
System.arraycopy 和Arrays.copyOf
System.arraycopy和arrays.copyOf
Java中 System.arraycopy() 和 Arrays.copyOf()方法