陣列拷貝
首先了解深拷貝 淺拷貝
陣列的四種拷貝方式:
1.for回圈拷貝
代碼示例:
import java.util.Arrays;
public class TestDemo{
public static void main(String[] args) {
int[] array1 ={1,2,3,4,5,6};
int[] array2 =new int [array1.length];
for (int i = 0; i <array1.length ; i++) {
array2[i] = array1[i];
}
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
}
結果:

此時,修改array2 0下標的值,發現對array1沒影響;
import java.util.Arrays;
public class TestDemo{
public static void main(String[] args) {
int[] array1 ={1,2,3,4,5,6};
int[] array2 =new int [array1.length];
for (int i = 0; i <array1.length ; i++) {
array2[i] = array1[i];
}
System.out.println("==============");
array2[0]=99;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
}
結果:

創建了一個陣列物件, 拷貝原有陣列中的所有元素到新陣列中. 因此, 修改原陣列, 不會影響到新陣列,即通過一個參考去修改拷貝后的值,發現并不影響原來物件的值,這種拷貝屬于深拷貝,
2.copyof拷貝
代碼示例:
public static void main(String[] args) {
int[] array1 = {1,2,3,4,5,6};
System.out.println(Arrays.toString(array1));
int[] array2 = Arrays.copyOf(array1,array1.length);
System.out.println("==============");
array2[0]=99;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
結果:

同第一個: copyOf 是將陣列進行了 深拷貝, 即又創建了一個陣列物件, 拷貝原有陣列中的所有元素到新陣列中,因此, 修改原陣列,不會影響到新陣列,
3.System.arraycopy拷貝

import java.util.Arrays;
public class TestDemo {
public static void main(String[] args) {
int[] array1 = {1, 2, 3, 4, 5, 6};
int[] array2 = new int[array1.length];
System.out.println(Arrays.toString(array1));
System.arraycopy(array1, 0, array2, 0, array1.length);
System.out.println("==============");
array2[0] = 99;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
}
結果:

System.arraycopy拷貝也為深拷貝,
前三種拷貝方式速度最快是System.arraycopy拷貝,
4.clone拷貝
參考.clone
克隆 這個參考所指向的物件
這個參考所指向的物件就會被克隆(生成一個副本)
代碼示例;
public static void main(String[] args) {
int[] array1 = {1, 8, 9, 4, 13, 26};
System.out.println(Arrays.toString(array1));
//array2 指向了剛剛生成的副本
int [] array2 = array1.clone();
System.out.println("==============");
array2[0] = 99;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
結果:

此時也可以看出,修改原陣列, 不會影響到新陣列,所以也為深拷貝,
實際上,本質來說這四種都屬于淺拷貝
上面四種屬于深拷貝的原因是因為剛剛陣列中存放的是簡單型別,
如果放的是參考型別,它們均屬于淺拷貝,
畫圖說明淺拷貝:

當陣列中存放的是參考型別時,修改array2中的某個元素的值,同時也修改了array1中的值,這種方法叫淺拷貝,
怎么修改成深拷貝呢?當我們拷貝array1時,將它所參考的值也拷貝過來,此時修改array2中的某個元素的值,array1中的值不變,如圖:

總結:
這四種陣列拷貝的方式均為淺拷貝
幾個小知識點:
1.拷貝部分陣列;
代碼示例:
public static void main(String[] args) {
int[] array1 = {2, 8, 9, 10, 12, 26};
int[] ret = Arrays.copyOfRange(array1,2,5);
System.out.println(Arrays.toString(ret));
}
結果:

2.比較兩個陣列
代碼示例:
public static void main(String[] args) {
int[] array1 = {2, 8, 9, 10, 12, 26};
int[] array2 = {2, 8, 9, 10, 12, 26, 30,35};
System.out.println(Arrays.equals(array1, array2));
}
結果:

3.陣列完全填充
代碼示例:
public static void main(String[] args) {
int[] array1 =new int[10];
Arrays.fill(array1,6);
System.out.println(Arrays.toString(array1));
}
結果:

4.陣列部分填充
代碼示例:
public static void main(String[] args) {
int[] array1 =new int[10];
Arrays.fill(array1,2,6,8);
System.out.println(Arrays.toString(array1));
}
結果:

完,(要我的命)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/243562.html
標籤:java
