new Vector <object>(myOtherVector):克隆还是引用?

时间:2015-09-25 08:15:58

标签: java vector

我的问题是,这个调用是否会将另一个向量的内容克隆到新向量中,或者它是否会创建对另一个向量中数据的引用?

new Vector<Object>(myOtherVector);

http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html#Vector(java.util.Collection)

4 个答案:

答案 0 :(得分:2)

  

按照集合迭代器返回的顺序构造一个包含指定集合元素的向量。

这是构造函数的source code。它是对传递元素的引用的副本

 public Vector(Collection<? extends E> c) {
167         elementData = c.toArray();
168         elementCount = elementData.length;
169         // c.toArray might (incorrectly) not return Object[] (see 6260652)
170         if (elementData.getClass() != Object[].class)
171             elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
172     }

答案 1 :(得分:2)

您链接到州的规范

  

构造一个包含指定集合元素的向量...

换句话说,相同的元素将被放置在新的Vector中,它不会创建新的副本。

答案 2 :(得分:1)

以下是Vector构造函数的实现。所以它是原始数组的副本,带有对现有对象的引用。

public Vector(Collection<? extends E> c) {
    elementData = c.toArray();
    elementCount = elementData.length;
    // c.toArray might (incorrectly) not return Object[] (see 6260652)
    if (elementData.getClass() != Object[].class)
        elementData = Arrays.copyOf(elementData, elementCount,  Object[].class);
}

答案 3 :(得分:1)

当我对此有任何疑问时,我会举一个简单的例子:

private static class MyClass {
        int id;
    public MyClass(int i) {
        id = i;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "" + id;
    }

    public void setId(int i) {
        id = i;
    }
}

public static void main(String[] args) {
    Vector<MyClass> old = new Vector<MyClass>();

    old.add(new MyClass(1));
    old.add(new MyClass(2));
    old.add(new MyClass(3));
    Vector<MyClass> newVec = new Vector<MyClass>(old);
    old.get(0).setId(1000);
    System.out.println(Arrays.toString("old "+old.toArray()));
    System.out.println(Arrays.toString("newVec "+newVec.toArray()));
}

结果:

old [1000, 2, 3]
newVec [1000, 2, 3]

正如您所看到的,Vector中的对象是相同的,它不会对对象进行复制,只需创建对该实例的新引用即可。