章
目
录
学习如何在Java中创建数组副本。我们将学习使用易于理解的示例来创建浅拷贝和深拷贝数组。
1.创建数组的浅拷贝
在浅拷贝中,数组项的引用被复制到新数组中,因此对数组或数组项的任何更改都会在克隆的复制数组中可见。数组的clone()
方法创建浅拷贝。让我们通过一些在Java中创建数组浅拷贝的方法来了解一下。
1.1. 使用Object.clone()方法
在Java中,要创建数组的克隆,我们应该使用array.clone()
。它创建数组的浅拷贝。默认克隆总是创建数组的浅拷贝。对原始数组的任何更改也会反映在克隆数组中。
Employee[] clonedArray = empArray.clone();
让我们看一个例子。当我们对empArray的项目进行更改时,克隆数组中的项目也会发生更改。
Employee[] empArr = new Employee[2]; //原数组
empArr[0] = new Employee(100, "Lokesh", "Gupta", new Department(1, "HR"));
empArr[1] = new Employee(200, "Pankaj", "Kumar", new Department(2, "Finance"));
Employee[] clonedArray = empArray.clone(); //浅拷贝数组
empArray[0].setFirstName("Unknown");
empArray[0].getDepartment().setName("Unknown");
System.out.println(empArray[0].getFirstName()); //Unknown
System.out.println(empArray[0].getDepartment().getName()); //Unknown
System.out.println(clonedArray[0].getFirstName()); //Unknown
System.out.println(clonedArray[0].getDepartment().getName()); //Unknown
1.2. 使用Arrays.copyOf()
Arrays.copyOf(array, newLength)
方法复制指定的数组,将其截断或填充默认值,以使复制的数组具有指定的newLength。
copyOf()
是一个重载的方法,因此要填充到空位的默认值取决于数组中元素的类型。例如,布尔数组将填充为false,整数数组将填充为0。对象类型将填充为null。
Employee[] empArr = new Employee[2];
Employee[] copiedArray = Arrays.copyOf(empArray, empArr.length);
1.3. 使用System.arraycopy()
JDK提供的另一个有用的方法。它是一个本地方法,并且在内部也在Arrays.copyOf()
方法内部调用。但是,由于在调用时使用了多个参数,这使得代码稍微难以阅读。
arraycopy()方法将从srcArray(起始位置srcPos)复制项目到destArray(起始位置destPos)。要复制的项目数量由length参数指定。
public static native void arraycopy(Object srcArray, int srcPos, Object destArray, int destPos, int length);
在下面的示例中,将从names数组中复制所有项目到copyOfNames数组,从两个数组的零位置开始。
String[] names = {"Alex", "Brian", "Charles", "David"};
String[] copyOfNames = new String[names.length];
System.arraycopy(names, 0, copyOfNames, 0, copyOfNames.length);
System.out.println(Arrays.toString(names)); //[Alex, Brian, Charles, David]
System.out.println(Arrays.toString(copyOfNames)); //[Alex, Brian, Charles, David]
2.创建数组的深拷贝
在深拷贝中,数组项的新实例被创建,因此对原始数组的任何更改不会反映在复制的数组上。内存序列化是在Java中创建对象的深拷贝的一种快捷方式。如果您想在Java中创建数组的深拷贝,那么请使用Apache Common的SerializationUtils.clone(array)
方法。
Employee[] copiedArray = SerializationUtils.clone(empArray); //深拷贝数组
让我们通过一个示例来验证。
Employee[] empArray = new Employee[2];
empArray[0] = new Employee(100, "Lokesh", "Gupta", new Department(1, "HR"));
empArray[1] = new Employee(200, "Pankaj", "Kumar", new Department(2, "Finance"));
Employee[] copiedArray = SerializationUtils.clone(empArray); //深拷贝数组
empArray[0].setFirstName("Unknown");
empArray[0].getDepartment().setName("Unknown");
//Verify the change in original array - "CHANGED"
System.out.println(empArray[0].getFirstName()); //Unknown
System.out.println(empArray[0].getDepartment().getName()); //Unknown
//Verify the change in deep copied array - "UNCHANGED"
System.out.println(copiedArray[0].getFirstName()); //Lokesh
System.out.println(copiedArray[0].getDepartment().getName()); //HR
以上就是Java 数组克隆 – 深拷贝和浅拷贝的全部内容。