Java 数组克隆 – 深拷贝和浅拷贝

培训教学 潘老师 7个月前 (09-24) 157 ℃ (0) 扫码查看

学习如何在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 数组克隆 – 深拷贝和浅拷贝的全部内容。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/9251.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】