2

我有一个包含许多对象的向量。我的代码使用循环根据特定条件将对象添加到 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 向量中。我应该在循环中创建一个新的 StringBuffer 并添加它还是该代码可以工作?谢谢您的帮助!

埃里克

4

6 回答 6

5

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

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

于 2010-03-07T15:20:27.127 回答
2

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

题外话:Vector已经过时了。你可能会更好ArrayList(或者其他实现的类之一List,如果你不需要一个支持它的数组)。

于 2010-03-07T15:17:36.963 回答
2

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

于 2010-03-07T15:17:45.870 回答
2

如果您必须将一个独立的对象添加到 Vector,请每次创建一个新对象。

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

于 2010-03-07T15:18:09.613 回答
1

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

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

于 2010-03-07T15:20:05.600 回答
1

正如这里的大多数答案所说, aVector存储对 type 对象的引用ObjectObject如果您每次更改底层证券,您最终会得到一个Vector包含大量对一个对象的引用,该对象现在包含您给它的最后一个值。

根据变量的名称,我猜您实际上希望将数字存储在 Vector 中。

在理想的世界中,您只需将类型的对象添加int到 Vector 中。不幸的是,在 Java 中 anint是一种“原始类型”,并且Vector只能存储 type 的对象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 可以包含哪些对象(称为“泛型”,类似于 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 上运行,则不能使用它们。

于 2010-03-09T01:59:41.590 回答