(一)四種拷貝方式
在日常編程的過程中,我們很有可能會用到對數組的拷貝。而拷貝主要有四種方式。
- for循環對數組中的元素進行拷貝 (淺拷貝)。
- clone (淺拷貝)
- System.arrayCopy() (淺拷貝)
- Arrays.copyof() (淺拷貝)
(1)for循環對數組中的元素進行拷貝
代碼示例:
public class TestDemo{
public static void main(String[] args) {
int[] array={1,3,6,2,5};
int[] array2 = new int[array.length];
for(int i=0;i<array.length;i++){
array2[i] = array[i];
}
System.out.println(Arrays.toString(array));
System.out.println(Arrays.toString(array2));
}
}
(2)clone
代碼示例:
public class TestDemo{
public static void main(String[] args) {
int[] array={1,2,3,4,5};
int[] array2=new int[array.length];
array2=array.clone();
System.out.println(Arrays.toString(array));
System.out.println(Arrays.toString(array2));
}
(3)System.arrayCopy()
源碼如下:
public static native void arraycopy(Object src, int srcPos,Object dest, int destPos,int length);
native代表native方法,即底層由C/C++實現,因此速度較快。
代碼示例:
public class TestDemo{
public static void main(String[] args) {
int[] array={1,2,3,4,5};
int[] array2=new int[array.length];
System.arraycopy(array,0,array2,0,array.length);
System.out.println(Arrays.toString(array));
System.out.println(Arrays.toString(array2));
}
}
(4)Arrays.copyof()
源碼如下:
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
從源碼中可以看出Arrays.copyof調用的依舊是System.arrayCopy
代碼示例:
public class TestDemo{
public static void main(String[] args) {
int[] array={1,2,3,4,5};
int[] array2=new int[array.length];
array2=Arrays.copyOf(array,array2.length);
System.out.println(Arrays.toString(array));
System.out.println(Arrays.toString(array2));
}
}
以上就是數組的四種拷貝方式,當然,它們相對於數組而言,都是淺拷貝。但是clone對於對象而言,是深拷貝。
而淺拷貝就是兩個引用(地址)同時指向同一塊內存(對象)
如以下示例:
class TestArray {
private int val = 10;
public int getVal() {
return val;
}
public void setVal(int val) {
this.val = val;
}
}
public class TestDemo{
public static void main(String[] args) {
TestArray[] testArrays = new TestArray[3];
testArrays[0] = new TestArray();
testArrays[1] = new TestArray();
testArrays[2] = new TestArray();
TestArray[] testArrays2 = Arrays.copyOf(testArrays,testArrays.length);
System.out.println("=====拷貝後======");
for (int i = 0; i < testArrays.length; i++) {
System.out.print(testArrays[i].getVal() + " ");
}
System.out.println();
for (int i = 0; i < testArrays2.length; i++) {
System.out.print(testArrays2[i].getVal()+ " ");
}
System.out.println();
System.out.println("=====修改後======");
testArrays2[0].setVal(10000);
for (int i = 0; i < testArrays.length; i++) {
System.out.print(testArrays[i].getVal()+ " ");
}
System.out.println();
for (int i = 0; i < testArrays2.length; i++) {
System.out.print(testArrays2[i].getVal()+ " ");
}
}
在這個代碼中,如圖所示:
testArrays[0]和testArrays2[0]同時指向val,在修改第一個值之後,testArrays[0]和testArrays2[0]同時變化。