配列コピー
まず
、ディープコピーとシャローコピー配列の4つのコピー方法を理解します。
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.コピーのコピー
コード例:
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のコピーもディープコピーです。
最初の3つのコピー方法の最速のコピーはSystem.arraycopyコピーです。
4.クローンコピー
引用.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));
}
結果:
この時点で、元のアレイを変更しても新しいアレイに影響がないこともわかります。したがって、これもディープコピーです。
実際、本質的に、これらの4つのタイプは浅いコピーに属します
。上記の4つが深いコピーに属する理由は、単純なタイプがちょうど今配列に格納されているためです。参照型
を置くと、それらはすべて浅いコピーです。シャローコピーを説明するための図:参照型が配列に格納されている場合、array2の要素の値を変更し、array1の値も変更します。このメソッドはシャローコピーと呼ばれます。それをディープコピーに変更するにはどうすればよいですか?array1をコピーするときは、それが参照する値もコピーします。このとき、図に示すように、array2の要素の値を変更し、array1の値は変更されません。
総括する:
これらの4つの配列コピー方法は浅いコピーです
いくつかの小さな知識ポイント:
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.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));
}
結果:
終了しました。(私の人生を取りなさい)