-2

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

4 回答 4

14

你上面的代码很好,虽然太复杂了。它可以减少到

Vector copy = new Vector(original);

此外,您应该避免使用 Vector,而是使用 ArrayList。

于 2012-07-10T13:13:44.837 回答
7

[...]我改变了向量 v1,第二个 v2 也在改变......我的目标是即使我改变了源向量也能保持副本完好无损......

向量包含对对象的引用。如果您更改对象,则更改将从两个向量中可见。

我相信你所追求的是深拷贝

于 2012-07-10T13:12:19.407 回答
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();  
于 2014-02-07T11:46:11.143 回答
1

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();
    }
}
于 2012-07-10T13:16:42.580 回答