zoukankan      html  css  js  c++  java
  • ArrayList的深度copy和浅度拷贝

          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);
                }
            }
        }




  • 相关阅读:
    建站两个月,说说我的想法
    我见过的郭弃疾先生(兰亭集势CEO)
    C#数组和集合互相转换的几种方法的效率分析
    (五)React Ant Design Pro + .Net5 WebApi:后端环境搭建Autofac注入+ 泛型仓储
    关于C++中对私有的测试总结
    uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型(转)
    GDB调试
    linux删除乱码文件
    转:C++ nan
    vim
  • 原文地址:https://www.cnblogs.com/wala-wo/p/5119207.html
Copyright © 2011-2022 走看看