将对象添加到向量会丢失使用Java的引用?

时间:2010-03-07 15:14:59

标签: java vector stringbuffer

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

例如,在以下代码中:

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

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

我正在做的是将“temp”StringBuffer添加到numbersToCalculate Vector中。我应该在循环中创建一个新的StringBuffer并添加或者这个代码是否有效?谢谢你的帮助!

埃里克

6 个答案:

答案 0 :(得分:4)

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

只需将temp.setLength(0);替换为temp = new StringBuffer();

即可

答案 1 :(得分:2)

Vector将存储您提供的引用,它不会创建自己的对象副本。因此,如果您希望Vector将缓冲区与您继续使用的缓冲区分开,正如您所说,您需要通过创建新缓冲区而不是将旧的缓冲区设置为零来单独创建缓冲区。

偏离主题的旁注:Vector已过时。你最好使用ArrayList(或其他一个实现List的类,如果你不需要支持它的数组)。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

如果必须在Vector中添加一个独立对象,请每次都创建一个新对象。

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

答案 4 :(得分:1)

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

Java的赋值运算符始终复制用户定义类型的指针,而不是内容。

答案 5 :(得分: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;

如果IllegalCastException包含的内容不是Vector对象,则此代码将抛出Integer。如果您对此感到担心,可以在try catch声明中将其包含在内。

在你的例子中,你可能想要遍历Vector中的所有数字。您也可能想要更准确地说明您的Vector可以包含哪些对象(称为“Generics”,类似于C模板)。这是它的样子:

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

// Add stuff to the Vector

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

foreach和Generics构造仅在Java SDK 1.5中添加,因此如果要在早期的Java SDK上运行,则不能使用它们。