如何克隆ArrayList并在Java中克隆其项目?
例如,我有:
ArrayList<Dog> dogs = getDogs();
ArrayList<Dog> clonedList = ....something to do with dogs....
Run Code Online (Sandbox Code Playgroud)
我希望那些物品clonedList与狗列表中的物品不同.
我想知道是否有推荐的方法在java中进行深度克隆/复制实例.
我有三个解决方案,但我可以错过一些,我想得到你的意见
编辑:包括Bohzo的提议和改进问题:它更多的是深度克隆而不是浅层克隆.
在属性之后通过hand属性编写克隆代码并检查是否也克隆了可变实例.
亲:
- 控制将要执行的操作
- 快速执行
缺点:
- 编写和维护繁琐
- 容易出错(复制/粘贴失败,缺少属性,重新分配的可变属性)
使用您自己的反射工具或外部帮助程序(如jakarta common-beans),可以轻松编写一个通用的复制方法,该方法可以在一行中完成工作.
亲:
- 易于编写
- 没有维护
缺点:
- 对发生的事情的控制较少
- 如果反射工具也没有克隆子对象,则容易出现可变对象的错误
- 执行速度较慢
使用为您执行此操作的框架,例如:
commons-lang SerializationUtils
Java Deep Cloning Library
Dozer
Kryo
亲:
- 与反思一样
- 更多地控制将要克隆的内容.
缺点:
- 即使在层次结束时,每个可变实例都被完全克隆
- 执行起来可能非常慢
javassit,BCEL或cglib可能用于生成专用克隆器,只需单手写入.为此目的,有人知道使用这些工具之一的lib吗?
我错过了什么?
你会推荐哪一个?
谢谢.
我有一些数据结构,我想使用一个作为临时,另一个不是临时的.
ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();
//fill myTempObject here
....
//make myObject contain the same values as myTempObject
myObject = myTempObject;
//free up memory by clearing myTempObject
myTempObject.clear();
Run Code Online (Sandbox Code Playgroud)
现在这个问题当然是myObject真的只是指向myTempObject,所以一旦myTempObject被清除,也是如此myObject.
如何从保留值myTempObject在myObject使用Java?
是否有任何用于深度克隆java集合的实用程序:
注意:在不使用序列化的情况下更喜欢某些解决方案,但使用Object.clone()方法.我可以肯定我的自定义对象将实现clone()方法,并将只使用可克隆的java标准类...
我想制作一个对象的副本,然后在一些逻辑之后,重新分配原始对象的副本值.
例:
User userCopy = //make a copy
foreach(...)
{
user.Age = 1;
user.ID = -1;
UserDao.Update(user)
user = userCopy;
}
Run Code Online (Sandbox Code Playgroud)
我不希望通过引用复制它,它必须是按值复制.
以上只是一个示例,而不是我真正想要如何使用它,但我需要学习如何按值复制.
我从编译器得到的错误是"赋值的左侧必须是变量".我的用例是深度复制,但并不真正相关.
在C++中,可以分配给*this.
问题不在于如何规避任务this.这很简单,但是决定不做this变量的背后有什么理由.
原因是技术性的还是概念性的?
我的猜测到目前为止 - 在随机方法中重建Object的可能性容易出错(概念性),但技术上可行.
编辑请限制"因为Java规范如此说"的变化.我想知道决定的原因
最近我在采访中遇到了这个问题:
编写一个函数来返回类Drawing的深度克隆实例
public class Drawing{
public List<Shape> shapes=new LinkedList<Shape>();
}
Run Code Online (Sandbox Code Playgroud)
其中shape是一个具有许多具体实现的抽象类
public abstract class Shape implements Serializable{
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我们如何解决这个问题吗?我们是否需要在所有具体实现中添加克隆方法?
有没有通用的方法来实现将现有对象复制到另一个对象?
假设MyObj有一个id和name字段.像这样:
MyObj myObj_1 = new MyObj(1, "Name 1");
MyObj myObj_2 = new MyObj(2, "Name 2");
Run Code Online (Sandbox Code Playgroud)
代替
myObj_2.setName(myObj_1.getName()) // etc for each field
Run Code Online (Sandbox Code Playgroud)
做一些如下事情:
myObj_2.copyFrom(myObj_1)
Run Code Online (Sandbox Code Playgroud)
这样它们就是不同的实例,但具有相同的属性.
泛型类型的深层副本(克隆)如何T, E在Java中工作?可能吗?
E oldItem;
E newItem = olditem.clone(); // does not work
Run Code Online (Sandbox Code Playgroud) 这是一个非常基本的测试程序:
public class Body implements Serializable {
static int bod = 5;
int dis = -1;
public void show(){
System.out.println("Result: " + bod + " & " + dis);
}
}
public class Testing {
public static void main(String[] args) {
Body theBody = new Body();
theBody.show();
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("test.dat"));
out.writeObject(theBody);
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream("test.dat"));
Body bodyDouble = (Body)in.readObject();
in.close();
bodyDouble.show();
} catch(IOException e) {
} catch(ClassNotFoundException e) {
}
}
} …Run Code Online (Sandbox Code Playgroud)