2010-03-07 57 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上運行,你可以不使用它們。

相關問題