Java对象的 浅拷贝 、 深拷贝

Java对象的 浅拷贝 、 深拷贝

(一)浅拷贝(Shallow Copy)

1.基本数据类型及其包装类

对于intIntegerString这种基本数据类型或者基本数据类型的包装类来说,浅拷贝还是会复制一份新值给新对象,所以是两份不同的数据,对其中一个对象进行修改不会影响另一方的值

2.引用数据类型

对于StringBuilder或者POJO类这种引用数据类型,浅拷贝是将成员变量的引用复制一份给新对象,这样两个对象的成员变量都指向同一个实例,对其中一个进行修改会影响另一方的值

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
    public static void main(String[] args) {
//基本数据类型
ArrayList<String> al1 = new ArrayList<>();
al1.add("1");
ArrayList<String> al2 = (ArrayList<String>) al1.clone();
System.out.println("基本数据类型,更改前al1: " + al1);
System.out.println("基本数据类型,更改前al2: " + al2);
al1.set(0, "2");
System.out.println("基本数据类型,更改al1后al1: " + al1);
System.out.println("基本数据类型,更改al1后al2: " + al2);
al2.set(0, "3");
System.out.println("基本数据类型,更改al2后al1: " + al1);
System.out.println("基本数据类型,更改al2后al2: " + al2);

//引用数据类型
ArrayList<StringBuilder> al3 = new ArrayList<>();
al3.add(new StringBuilder("sb"));
ArrayList<StringBuilder> al4 = (ArrayList<StringBuilder>) al3.clone();
System.out.println("引用数据类型,更改前al3: " + al3);
System.out.println("引用数据类型,更改前al4: " + al4);
al3.get(0).append("在原对象中更改");
System.out.println("引用数据类型,更改al3后al3: " + al3);
System.out.println("引用数据类型,更改al3后al4: " + al4);
al4.get(0).append(",然后在复制对象中更改");
System.out.println("引用数据类型,更改al4后al3: " + al3);
System.out.println("引用数据类型,更改al4后al4: " + al4);
//输出:
// 基本数据类型,更改前al1: [1]
// 基本数据类型,更改前al2: [1]
// 基本数据类型,更改al1后al1: [2]
// 基本数据类型,更改al1后al2: [1]
// 基本数据类型,更改al2后al1: [2]
// 基本数据类型,更改al2后al2: [3]
// 引用数据类型,更改前al3: [sb]
// 引用数据类型,更改前al4: [sb]
// 引用数据类型,更改al3后al3: [sb在原对象中更改]
// 引用数据类型,更改al3后al4: [sb在原对象中更改]
// 引用数据类型,更改al4后al3: [sb在原对象中更改,然后在复制对象中更改]
// 引用数据类型,更改al4后al4: [sb在原对象中更改,然后在复制对象中更改]
}


(二)深拷贝(Deep Copy)

深拷贝是对所有成员变量都开辟新内存,然后复制其值,所以两个对象指向的是不同成员变量对象,对其中一方进行修改不会影响另一方的值

-------------本文结束感谢您的阅读-------------

本文标题:Java对象的 浅拷贝 、 深拷贝

文章作者:DragonBaby308

发布时间:2020年01月25日 - 12:40

最后更新:2020年01月25日 - 12:43

原始链接:http://www.dragonbaby308.com/clone/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%