zoukankan      html  css  js  c++  java
  • 浅表复制(克隆)和深表复制(克隆)

    首先我有一个自定义User类有一个age属性,此时:

           ArrayList list=new ArrayList();
           User user=new User();
          user.setAge(10);
           list.add(user);  
         //克隆,浅表复制,复制的是地址
           ArrayList list2=(ArrayList) list.clone();
           user=(User) list.get(0);
           user.setAge(20);

    System.out.println("list2的值"+((User) list2.get(0)).getAge());

    此时list和list2的.get(0)共用user地址,不管哪一个修改了age值,集合里存储的数据最终也都会跟着改变;

    如果不想共用一个user,这时就用到了深表克隆:

    深表克隆集合里的自定义类必须实现序列化:public class User implements Serializable {}

    此时写一个方法:

     private static ArrayList deepClone(ArrayList list) throws IOException, ClassNotFoundException {

    //写入流
      ByteArrayOutputStream byteout=new ByteArrayOutputStream();
      ObjectOutputStream out=new ObjectOutputStream(byteout);
      out.writeObject(list);


    //输出流到内存
      ByteArrayInputStream byteIn=new ByteArrayInputStream(byteout.toByteArray());
      ObjectInputStream in=new ObjectInputStream(byteIn);
      ArrayList dest=(ArrayList)in.readObject();
      return dest;
     }

    用这个方法后,两个list内存地址就不一样了;

        ArrayList list=new ArrayList();
           User user=new User();
          user.setAge(10);
           list.add(user);

     list2=deepClone(list);

     user=(User) list2.get(0);
           System.out.println(user.getAge());
           user.setAge(30);
           System.out.println("深表复制后......................");

     System.out.println("list的值"+((User) list.get(0)).getAge());
     System.out.println("list2的值"+((User) list2.get(0)).getAge());

    这样子第一个list输出10,第二个输出30;

  • 相关阅读:
    iOS开发数据库篇—SQLite的应用
    iOS开发数据库篇—SQL代码应用示例
    iOS开发数据库篇—SQL
    iOS开发数据库篇—SQLite简单介绍
    iOS开发网络篇—NSURLConnection基本使用
    iOS开发网络篇—数据安全
    iOS开发网络篇—GET请求和POST请求
    WordPress主题开发:开启文章缩略图功能
    WordPress主题开发:开启feed功能
    WordPress主题开发:循环代码
  • 原文地址:https://www.cnblogs.com/345214483-qq/p/3967204.html
Copyright © 2011-2022 走看看