深浅拷贝区别
浅拷贝:有两种方式,一种是把一个对象里面的所有的属性值和方法都复制给另一个对象,另一种是直接把一个对象赋给另一个对象,使得两个都指向同一个对象。
深拷贝:把一个对象的属性和方法一个个找出来,在另一个对象中开辟对应的空间,一个个存储到另一个对象中。
两者就在于,浅拷贝只是简单的复制,对对象里面的对象属性和数组属性只是复制了地址,并没有创建新的相同对象或者数组,新旧对象还是共享同一块内存。而深拷贝是完完全全的复制一份,空间大小占用一样但是位置不同,新对象跟原对象不共享内存,修改新对象不会改到原对象。
案例
利用一个名字生成器
循环生成随机名字放入list列表中
以下使用深拷贝
private static List<User> data(){
ArrayList<User> list = new ArrayList<>();
UserNameGenerate generate= new UserNameGenerate();
for (int i = 0; i < 30; i++) {
User user = new User();
// 姓氏随机生成
String familyName = generate.randFamilyName();
// 名字依托于性别产生
String randName = generate.randName(generate.randSex());
String[] fixed = randName.split("-");
String name = fixed[0];
String sex = fixed[1];
int age = generate.randAge();
user.setName(familyName.concat(name));
user.setSex(sex);
user.setAge(age);
user.setId(i);
list.add(user);
System.out.println(list);
}
return list;
像这样数据量小深拷贝无伤大雅
但是数据量一多起来,就容易内存不足
考虑使用浅拷贝来创建 大量数据
浅拷贝改法
在实体类中增加浅拷贝方法
public User clone() throws CloneNotSupportedException{
//浅拷贝
return (User)super.clone();
}
在循环外创建对象
循环内使用浅拷贝方法
User user1 = user.clone();
参考:
https://www.cnblogs.com/kimmy/p/3611221.html
http://t.csdn.cn/wz45r
https://blog.csdn.net/qq_42274641/article/details/104531556