java 的深度拷贝和浅度拷贝

 ArrayList的浅度拷贝方式:

  • 通过Collections.copy方法实现浅度拷贝

 

       ArrayList<GuideGroup> questionGuideGroupList = new ArrayList<GuideGroup>(Arrays.asList(new GuideGroup[guideGroupList.size()]));
       Collections.copy(questionGuideGroupList, guideGroupList);
       questionAnswerManInfo.setGuideGroupList(questionGuideGroupList);

              通过Collections.copy方式进行拷贝必须先确定list的长度。

  • 通过ArrayList.clone进行浅度拷贝

 

       ArrayList<GuideGroup>questionGuideGroupList = (ArrayList<GuideGroup>) guideGroupList.clone()

 

  • ArrayList.addAll实现浅度拷贝

 

       ArrayList<GuideGroup> questionGuideGroupList = new ArrayList<GuideGroup>();
<pre name="code" class="java">       questionGuideGroupList.addAll(questionGuideGroupList);

 


 

 

     ArrayList深度拷贝方式

  • 通过序列化方式进行深度拷贝

             1、序列化javabean

                    a)、javabean 继承Serializable 接口,允许javabean序列化。

                    b)、javabean 继承Cloneable接口,同时必须实现clone()方法,clone()方法可以直接饮用父类的clone()方法

 

public class GuideGroup implements Cloneable, Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String groupKey;
    private String groupName;
    private int groupUserCount;
    private int groupCorrectCount;
    private int groupWrongCount;
    private int groupUnTestedCount;
    private String groupCorrectRate;
    private String groupWrongRate;
    private String groupUnTestedRate;
    private List<GuideGroupUser> guideGroupUserList;
    
    /**
     * @return the groupKey
     */
    public String getGroupKey() {
        return groupKey;
    }
    /**
     * @param groupKey the groupKey to set
     */
    public void setGroupKey(String groupKey) {
        this.groupKey = groupKey;
    }
    /**
     * @return the groupName
     */
    public String getGroupName() {
        return groupName;
    }
    /**
     * @param groupName the groupName to set
     */
    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }
    /**
     * @return the groupCorrectCount
     */
    public int getGroupCorrectCount() {
        return groupCorrectCount;
    }
    /**
     * @param groupCorrectCount the groupCorrectCount to set
     */
    public void setGroupCorrectCount(int groupCorrectCount) {
        this.groupCorrectCount = groupCorrectCount;
    }
    /**
     * @return the groupWrongCount
     */
    public int getGroupWrongCount() {
        return groupWrongCount;
    }
    /**
     * @param groupWrongCount the groupWrongCount to set
     */
    public void setGroupWrongCount(int groupWrongCount) {
        this.groupWrongCount = groupWrongCount;
    }
    /**
     * @return the groupUnTestedCount
     */
    public int getGroupUnTestedCount() {
        return groupUnTestedCount;
    }
    /**
     * @param groupUnTestedCount the groupUnTestedCount to set
     */
    public void setGroupUnTestedCount(int groupUnTestedCount) {
        this.groupUnTestedCount = groupUnTestedCount;
    }
    /**
     * @return the groupCorrectRate
     */
    public String getGroupCorrectRate() {
        return groupCorrectRate;
    }
    /**
     * @param groupCorrectRate the groupCorrectRate to set
     */
    public void setGroupCorrectRate(String groupCorrectRate) {
        this.groupCorrectRate = groupCorrectRate;
    }
    /**
     * @return the groupWrongRate
     */
    public String getGroupWrongRate() {
        return groupWrongRate;
    }
    /**
     * @param groupWrongRate the groupWrongRate to set
     */
    public void setGroupWrongRate(String groupWrongRate) {
        this.groupWrongRate = groupWrongRate;
    }
    /**
     * @return the groupUnTestedRate
     */
    public String getGroupUnTestedRate() {
        return groupUnTestedRate;
    }
    /**
     * @param groupUnTestedRate the groupUnTestedRate to set
     */
    public void setGroupUnTestedRate(String groupUnTestedRate) {
        this.groupUnTestedRate = groupUnTestedRate;
    }
    public int getGroupUserCount() {
        return groupUserCount;
    }
    public void setGroupUserCount(int groupUserCount) {
        this.groupUserCount = groupUserCount;
    }
    public List<GuideGroupUser> getGuideGroupUserList() {
        return guideGroupUserList;
    }
    public void setGuideGroupUserList(List<GuideGroupUser> guideGroupUserList) {
        this.guideGroupUserList = guideGroupUserList;
    }    
    
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }        
}

           2、实现深度拷贝方法

 

     * 深度拷贝list
     * 要求对对象进行序列化,并实现Cloneable接口
     * */
     public static List<?> deepCopy(List<?> src) {
        try{
            ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(byteOut);
            out.writeObject(src);
     
            ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
            ObjectInputStream in = new ObjectInputStream(byteIn);
            List<?> dest = (List<?>) in.readObject();   

            return dest;
        }catch(IOException e){
            e.printStackTrace();
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }

        return null;
    }    
       

           3、深度拷贝调用

 

     /*对对象进行深度拷贝*/
     ArrayList<GuideGroup> questionGuideGroupList = (ArrayList<GuideGroup>)  deepCopy(guideGroupList);
     questionAnswerManInfo.setGuideGroupList(questionGuideGroupList);

 

  • 通过递归方式实现深度拷贝

             通过递归方式,使用add方法实现深度拷贝

 

    public void copy(List src,List dest){
        for (int i = 0 ;i < src.size() ; i++) {
            Object obj = src.get(i);            
            if (obj instanceof List){
            dest.add(new ArrayList());
                copy((List)obj,(List)((List)dest).get(i));
            }else{
            dest.add(obj);
            }
        }
    }
### 拷贝与深拷贝的概念 拷贝创建一个新的对象,这个新对象拥有原始对象属性值的一个副本。然而,对于非基本类型的属性(即引用类型),它会复制这些属性的引用而不是实际的对象[^1]。 深拷贝不仅创建新的对象来存储数据,而且递归地处理所有的子对象,确保每一个层次上的对象都被独立复制,从而使得源对象及其所有嵌套对象都不会被目标对象所共享。 ### JavaScript 中的实现方法 #### 拷贝JavaScript中可以使用`Object.assign()`或展开运算符(`...`)来进行拷贝操作: ```javascript // 使用 Object.assign 方法 const obj1 = { a: 1, b: { c: 2 } }; let shallowCopyObj = Object.assign({}, obj1); // 或者使用扩展运算符 ... shallowCopyObj = { ...obj1 }; console.log(shallowCopyObj === obj1.b); // true 表明b指向同一内存位置 ``` #### 深拷贝 为了执行真正的深拷贝,在JavaScript中有几种常见的方式,比如利用JSON序列化/反序列化或者第三方库lodash下的_.cloneDeep()函数: ```javascript // JSON 序列化 / 反序列化 (注意此法不适用于复杂结构如循环引用等情况) const deepCopyViaJson = JSON.parse(JSON.stringify(obj1)); // Lodash _.cloneDeep() import _ from 'lodash'; const lodashDeepCopy = _.cloneDeep(obj1); ``` ### Python中的实现方式 #### 拷贝 Python提供了内置模块copy用于简单地完成拷贝工作: ```python import copy list1 = ['a', ['b', 'c'], 'd'] shallow_copied_list = copy.copy(list1) print(id(list1), id(shallow_copied_list)) # 不同id表示不同实例 print(id(list1[1]), id(shallow_copied_list[1])) # 同一id表明内部列表相同 ``` #### 深拷贝 同样通过copy模块也可以轻松达成完全独立的新对象——深拷贝: ```python deep_copied_list = copy.deepcopy(list1) print(id(deep_copied_list[1]) != id(list1[1])) # True 表示已成功分离内层列表 ``` ### Java中的实现方式 #### 拷贝 可以通过继承Cloneable接口并重写Object类里的clone()方法来达到目的;需要注意的是默认情况下这只是一个克隆过程[^4]: ```java public class Student implements Cloneable { private String name; private int age; public Student(String name, int age){ this.name=name; this.age=age; } @Override protected Object clone() throws CloneNotSupportedException{ return super.clone(); } } ``` #### 深拷贝 要真正意义上做到深层复制,则需手动编写逻辑以确保存储于成员变量内的任何可变状态也被正确复制出来: ```java class DeepStudent extends Student { public DeepStudent(Student s) { super(s.getName(),s.getAge()); } // 构造器接收另一个student作为参数初始化当前对象 } // 创建原版学生对象 Student original = new Student("Alice", 20); // 执行深度复制 DeepStudent copied = new DeepStudent(original); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值