2010-03-07 44 views
1

我有一个矢量,包含一些对象。我的代码使用循环根据特定条件向Vector添加对象。我的问题是,当我将对象添加到Vector中时,是添加到矢量的原始对象引用还是Vector创建了该对象的新实例并添加了该对象?向矢量添加一个对象会失去使用Java的引用?

例如,在下面的代码:

private Vector numbersToCalculate; 
StringBuffer temp = new StringBuffer(); 

while(currentBuffer.length() > i) { 
    //Some other code 
    numbersToCalculate.add(temp); 
    temp.setLength(0); //resets the temp StringBuffer 
} 

我在做什么是增加了“临时”的StringBuffer的numbersToCalculate矢量。我是否应该在循环中创建一个新的StringBuffer并添加该代码或将此代码工作?谢谢您的帮助!

埃里克

+0

谢谢你们!我非常感谢帮助。 – ericso 2010-03-07 15:48:08

回答

4

您需要每次创建一个新的StringBuffer。 Vector中的每个项目项只是一个指向同一个StringBuffer对象的指针,因此每次通过循环时,您都将重置stringbuffer的单个实例,并将相同的引用添加到Vector中。

只需更换temp.setLength(0);temp = new StringBuffer();

2

Vector将存储你给它的参考,它不会产生自己的对象的副本。所以如果你想让Vector的缓冲区与你正在使用的缓冲区分开,就像你说的那样,你需要通过创建一个新的缓冲区来创建缓冲区,而不是将旧的长度设置为零。

题外话:Vector已过时。你最好用ArrayList(或者其他类中的其中一个实现List,如果你不需要支持它的数组)。

+1

当然,如果你用新的东西替换Vector,它会是ArrayList?你为什么想在这里使用地图? – DaveJohnston 2010-03-07 15:22:04

+0

@DaveJohnston:谢谢,那里有大脑衰竭,自从我处理旧的util类以来,它已经很长时间了。我正在考虑'Hashtable'。固定。 – 2010-03-07 15:24:37

+0

ArrayList不同步并且Vector是。如果多个线程正在访问数组,我想使用Vector ArrayList,是否正确? Vector over ArrayList有什么缺点? – ericso 2010-03-13 19:18:52

2

它每次都使用相同的对象。您应该在循环结束时添加一个temp = new StringBuffer();。 (循环的结果将是一个指向同一个空StringBuffer的Vector的向量)。

2

如果必须将一个独立对象添加到Vector中,则每次都要创建一个新对象。

您正在添加对矢量的引用。如果对象的状态发生变化,则对其的所有引用都会看到变化。

1

将元素插入到集合中不会,也不能创建对象的副本,因为Java没有用于用户定义类型的复制构造函数或运算符重载的正式概念。也就是说,通用集合无法知道如何复制包含的对象。

Java的赋值操作符总是复制用户定义类型的指针而不是内容。

1

由于大部分这里的答案说,一个Vector商店引用Object类型的对象。如果每次更改底层的Object,最后都会包含一个Vector,其中包含大量对一个对象的引用,它们现在包含您提供给它的最后一个值。

根据你的变量的名字,我猜你实际上想要在你的Vector中存储数字。

在理想的世界中,您只需将类型为int的对象添加到Vector中。不幸的是,在Java中,int是'原始类型',并且Vector只能存储Object类型的对象。这意味着您只能将Integer对象放入Vector中而不是int对象中。

所以,你的代码看起来是这样的:

// Put a number at index 0 
Integer inputNumber = new Integer(7); 
numbersToCalculate.add(0, inputNumber); 

// Some time later read out the value at index 0 
Object objFromVector = numbersToCalculate.elementAt(0); 

// Cast the Object to an Integer 
Integer numberToProcess = (Integer)objFromVector; 

如果Vector包含的东西是不是一个Integer对象时,此代码将抛出一个IllegalCastException。如果你担心这个问题,你可以在trycatch声明中包含它。

在你的例子中,你可能想要循环遍历向量中的所有数字。你也可能希望更加规定你的Vector可以包含什么对象(称为'泛型',它与C模板相似)。下面是它可能看上去是这样的:

Vector<Integer> myVector = new Vector<Integer>(); 

// Add stuff to the Vector 

for (Integer number : myVector) 
{ 
    // Do stuff with the number 
} 

foreach和泛型结构中的Java SDK 1.5只添加,所以如果你想要一个早期的Java SDK上运行,你可以不使用它们。

相关问题