越努力,越幸运 lucky.|

楚景然

园龄:7年6个月粉丝:30关注:7

java List深层拷贝和浅层拷贝

1.基础理解

对于基本数据类型,实际上是拷贝它的值,而对于引用数据类型,拷贝的就是它的引用,并没有创建一个新的对象,即没有分配新的内存空间。这样的拷贝就称作浅拷贝。

深拷贝就是在引用类型进行拷贝时,创建了新的对象,即分配了新的内存空间给拷贝对象。

2.示例

关于深层拷贝和浅层拷贝,建议简单理解为

  2.1浅层拷贝:ListA 有多条数据,ListB 拷贝ListA所有数据,当ListA中原有数据被修改时候,ListB中对于的数据也会被修改。 

List<User> user=userMapper.getUserByPhone(phone);//原始数据  此时手机号是1522222222
List<User> userNew=user;//拷贝数据此时手机号是1522222222
userNew.get(0).setPhone("153333333");//此处设置之后user.get(0).getPhone();userNew.get(0).getPhone() 手机号都是153333333

2.2 其他浅层拷贝

复制代码
//1 遍历循环复制 
List<User> userList = new ArrayList<User>(oldUsewrList.size());
 for(User user : oldUsewrList){
     userList.add(p);  
 }  

//2使用List实现类的构造方法
 List<User> userList = new ArrayList<User>(oldUsewrList);

//3使用list.addAll()方法
 List<User> userList = new ArrayList<User>();  
 userList.addAll(oldUsewrList);  

//4使用System.arraycopy()方法
  User[] userList=oldUsewrList.toArray(new User[0]);
  User[] newList=new User[userList.length];
  System.arraycopy(userList, 0, newList, 0, userList.length);

//5使用Stream的方式copy
 List<User> newList = userList.stream().collect(Collectors.toList());
复制代码

 

 

  深层拷贝: ListA 有多条数据,ListB 拷贝ListA所有数据,当ListA中原有数据被修改时候,ListB中对于的数据也会被修改。

复制代码
//1序列化深层拷贝   
public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(src); ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); ObjectInputStream in = new ObjectInputStream(byteIn); @SuppressWarnings("unchecked") List<T> dest = (List<T>) in.readObject(); return dest; }

//2调用
deepCopy

List<User> user=userMapper.getUserByPhone(phone);//原始数据  此时手机号是1522222222
List<User> userNew=deepCopy(user);//拷贝数据此时手机号是1522222222
userNew.get(0).setPhone("153333333");//此处设置之后user.get(0).getPhone()手机号都是1522222222;userNew.get(0).getPhone() 手机号是153333333

//3注意 使用序列化的方式深层拷贝,User.class 先需要 implements Serializable
public class User implements Serializable{}
 
复制代码

 

本文作者:楚景然

本文链接:https://www.cnblogs.com/1439107348s/p/15899310.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   楚景然  阅读(1290)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起