我的问题是,这个调用是否会将另一个向量的内容克隆到新向量中,或者它是否会创建对另一个向量中数据的引用?
new Vector<Object>(myOtherVector);
http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html#Vector(java.util.Collection)
答案 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中的对象是相同的,它不会对对象进行复制,只需创建对该实例的新引用即可。