java数组的深拷贝和浅拷贝
时间: 2024-12-25 16:21:07 浏览: 7
### Java 中数组的深拷贝和浅拷贝
#### 浅拷贝特性
对于基本数据类型的数组,浅拷贝会创建一个新的数组并将原始数组中的元素逐个复制到新数组中。然而,如果数组包含的是对象引用,则这些引用会被简单地复制而不是被克隆。这意味着源数组和目标数组共享相同的对象实例[^3]。
```java
// 浅拷贝例子
public class ShallowCopyExample {
public static void main(String[] args) throws CloneNotSupportedException {
Integer[] original = {1, 2, 3};
Integer[] shallowCopied = Arrays.copyOf(original, original.length);
// 修改其中一个数组的内容不会影响另一个数组(因为是基础类型)
shallowCopied[0] = 9;
System.out.println("Original Array: " + Arrays.toString(original));
System.out.println("Shallow Copied Array: " + Arrays.toString(shallowCopied));
Object obj1 = new Object();
Object[] refArray = {obj1};
Object[] refShallowCopied = Arrays.copyOf(refArray, refArray.length);
// 修改引用的对象会影响两个数组
((Object[])refShallowCopied)[0].toString(); // 这里假设有一个方法改变了内部状态
System.out.println("Reference Original Array: " + Arrays.deepToString(refArray));
System.out.println("Reference Shallow Copied Array: " + Arrays.deepToString(refShallowCopied));
}
}
```
#### 深拷贝特性
深拷贝不仅复制了数组本身还递归地复制了所有嵌套的对象。因此,在完成一次成功的深拷贝之后,任何对副本的操作都不会影响原来的数组及其子对象的状态[^1]。
```java
import java.util.Arrays;
class DeepCopyExample implements Cloneable {
private String[] data;
@Override
protected Object clone() throws CloneNotSupportedException {
// 创建当前类的新实例
DeepCopyExample copy = (DeepCopyExample) super.clone();
// 对于每一个字段执行必要的深拷贝逻辑
if (this.data != null){
this.data = this.data.clone();
}
return copy;
}
public static void main(String[] args) throws CloneNotSupportedException {
String[] strings = {"a", "b"};
DeepCopyExample example = new DeepCopyExample();
example.setData(strings);
// 执行深拷贝
DeepCopyExample deepCopy = (DeepCopyExample)example.clone();
// 更改原数组的一个元素
strings[0]="changed";
System.out.println("Original Data: "+Arrays.toString(example.getData()));
System.out.println("Deep Copy Data: "+Arrays.toString(deepCopy.getData()));
}
public String[] getData(){
return data;
}
public void setData(String[] data){
this.data=data;
}
}
```
阅读全文