复制矢量在Java中的矢量

时间:2012-07-10 13:10:29

标签: java collections

我想将矢量复制到另一个。问题是,如果我更改向量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);  
  }}

如何保持第二份副本完好无损?

4 个答案:

答案 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();
    }
}