我想将矢量复制到另一个。问题是,如果我更改向量v1
,则第二个向量v2
也会发生变化。我的目标是即使我更改源向量也保持副本完整。
import java.util.Collections;
import java.util.Vector;
public class CopyElementsOfVectorToVectorExample {
public static void main(String[] args) {
//create first Vector object
Vector v1 = new Vector();
//Add elements to Vector
v1.add("1");
v1.add("2");
v1.add("3");
//create another Vector object
Vector v2 = new Vector(v1.size());
v2.setSize(v1.size());
Collections.copy(v2,v1);
System.out.println("After copy, Second Vector Contains : " + v2);
}}
如何保持第二份副本完好无损?
答案 0 :(得分:12)
上面的代码很好,虽然太复杂了。它可以简化为
Vector copy = new Vector(original);
此外,您应该避免使用Vector,而是使用ArrayList。
答案 1 :(得分:7)
[...] 我更改了矢量v1,第二个v2也在改变...我的目标是即使我更改源矢量也保持副本完整.. 强>
向量包含引用到对象。如果更改了对象,则可以从两个向量中看到更改。
我相信你所追求的是deep copy。
答案 2 :(得分:3)
您可以使用以下代码克隆矢量。
Vector v1 = new Vector();
//Add elements to Vector
v1.add("1");
v1.add("2");
v1.add("3");
//create another Vector object
Vector v2 = (Vector)v1.clone();
答案 3 :(得分:0)
the problem is if I change the vector v1, the second v2 is changing too ...My goal is to keep the copy intact even if I change the source vector
这是因为Collections.copy(v2,v1)
制作 淡黄色副本 而不是深层副本。
对Vector
进行深层复制。
为之前的回答道歉。
修改:
我假设您的vector
包含Serializable
类型的对象。通过这种方法,您可以获得收藏品的深层副本。
static public Object deepCopy(Object oldObj) throws Exception {
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream(); // A
oos = new ObjectOutputStream(bos); // B
// serialize and pass the object
oos.writeObject(oldObj); // C
oos.flush(); // D
ByteArrayInputStream bin = new ByteArrayInputStream(
bos.toByteArray()); // E
ois = new ObjectInputStream(bin); // F
// return the new object
return ois.readObject(); // G
} catch (Exception e) {
System.out.println("Exception in ObjectCloner = " + e);
throw (e);
} finally {
oos.close();
ois.close();
}
}