• 浅表复制(克隆)和深表复制(克隆)


    首先我有一个自定义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;

  • 相关阅读:
    linux 挂载本地iso
    安装python
    QT中如何使用MYSQL 以及静态编译QT中如何加上MYSQL(2)
    qt中如何使用mysql 以及静态编译qt中如何加上mysql(1)
    关于写qt项目时的代码格式问题
    qt相关学习以及 qt creator如何静态编译
    Qt Creator中如何在QLabel上画矩形框并且保存画完后的图形
    android localsocket 传输大量数据的问题
    android binder使用demo
    android binder使用
  • 原文地址:https://www.cnblogs.com/345214483-qq/p/3967204.html
Copyright © 2020-2023  润新知