浅拷贝
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象共享同一块内存
代码展示
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
| import java.util.ArrayList;
public class ShallowCopyAndDeepCopyTest {
public static class User {
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; } }
public static void main(String[] args) {
User user = new User();
user.setName("123");
ArrayList<User> users1 = new ArrayList<>(), users2 = new ArrayList<>();
users1.add(user);
users2.add(user);
System.out.println("user1的0索引位置的对象中的name为: " + users1.get(0).getName()); System.out.println("user2的0索引位置的对象中的name为: " + users2.get(0).getName());
users1.get(0).setName("456");
System.out.println("user1的0索引位置的对象中的name为: " + users1.get(0).getName()); System.out.println("user2的0索引位置的对象中的name为: " + users2.get(0).getName());
} }
|
打印展示
深拷贝
深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象
代码展示
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| import java.util.ArrayList;
public class ShallowCopyAndDeepCopyTest {
public static class User implements Cloneable {
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Object clone() throws CloneNotSupportedException { return super.clone(); }
@Override public String toString() { return "User{" + "name='" + name + '\'' + '}'; } }
public static void main(String[] args) throws CloneNotSupportedException {
User user1 = new User();
user1.setName("123");
User user2 = (User)user1.clone();
User user3 = new User();
user3.setName("123");
ArrayList<User> users1 = new ArrayList<>(), users2 = new ArrayList<>(), users3 = new ArrayList<>();
users1.add(user1); users2.add(user2); users3.add(user3);
users1.get(0).setName("456");
System.out.println("user1的0索引位置的对象中的name为: " + users1.get(0).getName()); System.out.println("user2的0索引位置的对象中的name为: " + users2.get(0).getName()); System.out.println("user3的0索引位置的对象中的name为: " + users3.get(0).getName());
} }
|
打印展示