Java对数组的复制[转]

原文地址http://x10232.iteye.com/blog/2230762

定义一个数组

Java代码 复制代码 收藏代码
  1. int[] a={3,1,4,2,5};   
  2. int[] b=a;   
int[] a={3,1,4,2,5}; 
int[] b=a; 

  数组b只是对数组a的又一个引用,即浅拷贝。
  如果改变数组b中元素的值,其实是改变了数组a的元素的值,要实现深度复制,可以用clone或者System.arrayCopy

Java代码 复制代码 收藏代码
  1. int[] a={3,1,4,2,5};  
  2. int[] b=a.clone();  
  3. b[0]=10;  
  4. System.out.println(b[0]+"  "+a[0]);  
int[] a={3,1,4,2,5};
int[] b=a.clone();
b[0]=10;
System.out.println(b[0]+"  "+a[0]);

但是clone和System.arrayCopy都是对一维数组的深度复制。
对于二维数组则不一样:

Java代码 复制代码 收藏代码
  1. int[][] a={{3,1,4,2,5},{4,2}};  
  2. int[][] b=a.clone();  
  3. b[0][0]=10;  
  4. System.out.println(b[0][0]+"  "+a[0][0]);  
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=a.clone();
b[0][0]=10;
System.out.println(b[0][0]+"  "+a[0][0]);

输出为10  10所以clone并不能直接作用于二维数组。
  因为java中没有二维数组的概念,只有数组的数组。所以二维数组a中存储的实际上是两个一维数组的引用。当调用clone函数时,是对这两个引用进行了复制。
  要证明,只需看下面的输出

Java代码 复制代码 收藏代码
  1. int[][] a={{3,1,4,2,5},{4,2}};  
  2. int[][] b=a.clone();  
  3. b[0][0]=10;  
  4. System.out.println(b[0][0]+"  "+a[0][0]);  
  5. System.out.println(a[0]==b[0]);  
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=a.clone();
b[0][0]=10;
System.out.println(b[0][0]+"  "+a[0][0]);
System.out.println(a[0]==b[0]);

第5句输出为true.用clone对二维数组进行复制,要在每一维上调用clone函数

Java代码 复制代码 收藏代码
  1. int[][] a={{3,1,4,2,5},{4,2}};  
  2. int[][] b=new int[a.length][];  
  3. for(int i=0;i<a.length;i++)  
  4. {   
  5. b[i]=a[i].clone();  
  6. }   
  7. b[0][0]=10;  
  8. System.out.println(b[0][0]+"  "+a[0][0]);  
  9. System.out.println(b[0]==a[0]);  
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=new int[a.length][];
for(int i=0;i<a.length;i++)
{ 
b[i]=a[i].clone();
} 
b[0][0]=10;
System.out.println(b[0][0]+"  "+a[0][0]);
System.out.println(b[0]==a[0]);

输出为10  3 false
  小结:
  数组的复制方法现在至少有四个思路:
  1 使用循环结构 这种方法最灵活。唯一不足的地方可能就是代码较多
  2 使用Object类的clone()方法, 这种方法最简单,得到原数组的一个副本。灵活形也最差。效率最差,尤其是在数组元素很大或者复制对象数组时。

Java代码 复制代码 收藏代码
  1. protected Object clone()   
protected Object clone() 

  3 使用Systems的arraycopy这种方法被告之速度最快,并且灵活性也较好,可以指定原数组名称、以及元素的开始位置、复制的元素的个数,目标数组名称、目标数组的位置。

Java代码 复制代码 收藏代码
  1. static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)   
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 

  4 Arrarys类的copyOf()方法与copyOfRange()方法可实现对数组的复制

Java代码 复制代码 收藏代码
  1. static <T> T[] copyOf(T[] original, int newLength)  
  2. static <T> T[] copyOfRange(T[] original, int from, int to)   
static <T> T[] copyOf(T[] original, int newLength)
static <T> T[] copyOfRange(T[] original, int from, int to) 

参考文献http://jingyan.baidu.com/article/e4d08ffddbb7610fd2f60d90.html

原文地址:https://www.cnblogs.com/byron0918/p/4682739.html