简介

​ArrayList​​​深拷贝和浅拷贝。​​ArrayList​​​的​​clone()​​​方法用于创建​​list​​​的浅表副本。在新列表中,仅复制对象引用。如果我们在第一个​​ArrayList​​​中更改对象状态,则更改后的对象状态也将反映在克隆的​​ArrayList​​中。

浅拷贝示例

使用​​clone()​​​将​​String​​列表复制到新列表的Demo。

package com.fun;

import java.util.ArrayList;

public class AR {
<span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #a626a4; line-height: 26px;">public</span> <span class="hljs-keyword" style="color: #a626a4; line-height: 26px;">static</span> <span class="hljs-keyword" style="color: #a626a4; line-height: 26px;">void</span> <span class="hljs-title" style="color: #4078f2; line-height: 26px;">main</span><span class="hljs-params" style="line-height: 26px;">(String[] args)</span> </span>{


ArrayList<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
list.add("give");

System.out.println("原始对象 : " + list);

ArrayList clonedLis = (ArrayList) list.clone();

System.out.println("拷贝对象 : " + clonedLis);

}

}

复制代码

控制台输出:

package com.fun;

import java.util.ArrayList;

public class AR {
<span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #a626a4; line-height: 26px;">public</span> <span class="hljs-keyword" style="color: #a626a4; line-height: 26px;">static</span> <span class="hljs-keyword" style="color: #a626a4; line-height: 26px;">void</span> <span class="hljs-title" style="color: #4078f2; line-height: 26px;">main</span><span class="hljs-params" style="line-height: 26px;">(String[] args)</span> </span>{


ArrayList<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
list.add("give");

System.out.println("原始对象 : " + list);

ArrayList clonedLis = (ArrayList) list.clone();

System.out.println("拷贝对象 : " + clonedLis);

}

}

复制代码

浅拷贝之引用对象

示例程序将​​ArrayList​​与自定义对象进行浅表复制。克隆列表之后,修改原始对象。

package com.fun;

import java.util.ArrayList;

public class AR {

public static void main(String[] args) {

ArrayList<Student> list = new ArrayList<>();
list.add(new Student(18, "fun"));
list.add(new Student(20, "tester"));
ArrayList<Student> clonedList = (ArrayList) list.clone();
Student student = clonedList.get(1);
student.name = "FunTester";
System.out.println("原始对象 : " + clonedList);
System.out.println("拷贝对象 : " + list);
}

}

class Student {

public int id;

public String name;

public Student(int id, String name) {
this.id = id;
this.name = name;
}

@Override
public String toString() {
return "学生信息:id=" + id + ", name=" + name + "]";
}

}

控制台输出:

INFO-> 当前用户:fv,IP:192.168.0.103,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.4
原始对象 : [学生信息:id=18, name=fun], 学生信息:id=20, name=FunTester]]
拷贝对象 : [学生信息:id=18, name=fun], 学生信息:id=20, name=FunTester]]

Process finished with exit code 0
  • 可以看出来浅拷贝是引用拷贝。

深度复制示例

下面的程序创建对象的深层副本。对克隆列表的修改不会影响原始列表。

package com.fun;

import com.fun.frame.httpclient.FanLibrary;

import java.util.ArrayList;

public class AR extends FanLibrary {

public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<>();
list.add(new Student(100, "fun"));
list.add(new Student(101, "tester"));
ArrayList<Student> clonedList = new ArrayList<>();
for (Student student : list) {
clonedList.add(student.clone());
}
Student student = clonedList.get(1);
student.name = "FunTester";
System.out.println("Cloned list : " + clonedList);
System.out.println("Original list : " + list);

}

}

class Student {

public int id;

public String name;

public Student(int id, String name) {
this.id = id;
this.name = name;
}

@Override
public String toString() {
return "学生信息:id=" + id + ", name=" + name + "]";
}

@Override
public Student clone() {
return new Student(this.id, this.name);
}

}

控制台输出:

INFO-> 当前用户:fv,IP:192.168.0.103,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.4
Cloned list : [学生信息:id=100, name=fun], 学生信息:id=101, name=FunTester]]
Original list : [学生信息:id=100, name=fun], 学生信息:id=101, name=tester]]

Process finished with exit code 0

参考文章:

  • 从JVM堆内存分析验证深浅拷贝
  • 拷贝HttpRequestBase对象

ArrayList浅、深拷贝_编码格式