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);
}
}
}
ArrayList的深度copy和浅度拷贝的更多相关文章
- List的深度copy和浅度拷贝
List<Student> list= Arrays.asList( new Student("Fndroid", 22, Student.Sax.MALE, 180) ...
- C#深度拷贝和浅度拷贝方法
C#浅度拷贝多用于值类型的复制,即 int a=1;int b=a; 设置b=2后不会影响a的值. 但如果对于引用类型class a=new class(); class b=a; 设置b.name= ...
- Java中深度克隆和浅度克隆
一:使用目的: 就是为了快速构造一个和已有对象相同的副本.如果需要克隆对象,一般需要先创建一个对象,然后将原对象中的数据导入到新创建的对象中去,而不用根据已有对象进行手动赋值操作. 二:Object中 ...
- Java的深度克隆和浅度克隆
说到克隆,其实是个比较简单的概念,跟现实生活正的克隆一样,复制一个一模一样的对象出来.clone()这个方法是从Object继承下来的,一个对象要实现克隆,需要实现一个叫做Cloneable的接口,这 ...
- .NET基础之深度复制和浅度复制
之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉. 如果大家不懂值类型和引用类型的区别,请先看http://www.cnblogs.com/Autumo ...
- scp(secure copy)安全拷贝
scp(secure copy)安全拷贝 (1)scp定义: scp可以实现服务器与服务器之间的数据拷贝.(from server1 to server2) (2)基本语法 命令 递归 要拷贝的文 ...
- Cloneable接口的作用与深度克隆与浅度克隆
cloneable接口的作用 cloneable其实就是一个标记接口,只有实现这个接口后,然后在类中重写Object中的clone方法,然后通过类调用clone方法才能克隆成功,如果不实现这个接口,则 ...
- C#深度复制和浅度复制
C#深度复制和浅度复制 复制一个值变量很简单,新建一个变量然后将原来的变量赋值过去就行,但是复制一个引用变量这种方法是不行的,如果不明白为什么可以先看看这篇解释 引用类型变量和值类型变量在赋值时的不同 ...
- LeetCode----Copy List with Random Pointer 深度拷贝,浅度拷贝,Lazy拷贝解析
题目:A linked list is given such that each node contains an additional random pointer which could poin ...
随机推荐
- 我的第一个Struts程序
1.程序结构 2.各种文件 LoginAction.java package com.tfj.action; public class LoginAction { private String use ...
- POI导出数据内存溢出问题
POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好.3.8版本的POI新出来了SXSSFWorkbook,可以支持大数据量的操作,只是SXSSFWo ...
- 【转】win7 旗舰版激活密钥
原文网址:http://zhidao.baidu.com/question/1496641289562471179.html 旗舰版KH2J9-PC326-T44D4-39H6V-TVPBYTFP9Y ...
- java基础全套
这是我自己早前听课时整理的java基础全套知识 使用于初学者 也可以适用于中级的程序员 我做成了chm文档的类型 你们可以下载 笔记是比较系统全面,可以抵得上市场上90%的学习资料.讨厌那些随便 ...
- 2015年10月15日学习html基础笔记
一个互联网公司的分工,小公司要求全能,拿一个项目全部做出来.大公司分工明细,主要步奏为策划人员策划方案,美工人员设计图有.psd.rp等,前端人员做静态页面,后台人员获取数据java php .net ...
- 输入一个正数 n,输出所有和为 n 连续正数序列。 java实现
用了半小时才写出来啊, 其实这种思路应用范围很广,利用有序性这个特点,比如本体只要是有序就行,例如两个集合是有序的,求交集,有序数组的查找,有序数组的归并,有序有了优化的可能. 输入一个正数 n,输出 ...
- Linux中link,unlink,close,fclose详解
每一个文件,都可以通过一个struct stat的结构体来获得文件信息,其中一个成员st_nlink代表文件的链接数. 当通过shell的touch命令或者在程序中open一个带有O_CR ...
- centos "cannot open display"的问题
实用技巧:在Linux下设置xhost方法步骤 第一步:用root登陆linux,启动vnc服务: 第二步:根据vnc起来的端口,设置export DISPLAY=localhost:1(1表示vnc ...
- HDOJ-ACM1006(JAVA)
题意:输入一个角度degree,求出一天中时针分针秒针之间的角度大于这个角度degree的时间占一天总时间的比例 因此输入是0-120度, 输出比例,保留三位小数,-1为终止 暂时没想出来如何做这道题 ...
- CentOS设置在同一窗口打开文件夹
默认情况下,CentOS双击文件夹会打开一个新窗口.这对于习惯Windows的用户会感觉非常别扭.其实,如果用鼠标中键双击文件夹,就不会打开新窗口了.当然,也可以按照如下设置: 1. 打开任意一个文 ...