2012-05-16 236 views
0

我無法理解爲什麼我的代碼表現得像它一樣。我所做的是創建一個自定義類的ArrayList。填充類對象,然後將其添加到ArrayList。然後,我重用類對象並使用新值填充它,並將其添加到ArrayList,除非第一個被第二個覆蓋?有沒有某種內部指針或者數組列表還沒有被提交,這可能會導致這種情況?問題填充ArrayList

下面我宣佈我的ArrayList

private ArrayList<LiftData> arrylst_LiftData = new ArrayList<LiftData>(); 

然後,我創建我的自定義數據對象(只是一些屬性的類)

LiftData obj_LData = new LiftData(); 

未示出的一些代碼,使有效數據填充它,我想補充它到ArrayList

arrylst_LiftData.add(obj_LData); 

現在在這一點上代碼遍歷循環填充t他obj_LData與新值,然後它被添加到arraylist,但第一個不見了?

如果我添加ArrayList中下出的第二行添加所有的工作???

arrylst_LiftData.add(obj_LData); 
obj_LData = new LiftData(); 

有人可以請edjumakate我在發生什麼事嗎?

+0

在我看來,它是後者。我在兩種情況下重複使用同一個對象。像一張紙。我寫了一些答案並交給老師。老師把它還給我,然後我擦除寫作並做另一項任務,然後交給老師。在我看來,老師影印了第一張,所以我在重複使用這張紙時有什麼危害? – GPGVM

+0

你的想法是錯誤的。向ArrayList添加對象不會複製任何內容。它只是將一個指向ArrayList的指針添加到obj_LData指向的相同的東西。確切地說, – Pablo

+0

。我認爲這是ByVal,它是ByRef。正如其他人指出的那樣,ArrayLisrt不會創建新的內存並分配給它一個指針。完全是我的錯誤。 – GPGVM

回答

3

ArrayList,像所有的Java集合 - 事實上,在Java中所有變量 - 包含對象,而不是對象本身的引用。這聽起來像你只創建了一個對象LiftData,並填寫ArrayList多個引用。每次更改數據時,ArrayList中的每個對象都會發生變化 - 因爲它們都是同一個對象。

這是相反的,如果你在C++中使用基本相同的語法你會得到什麼;插入vector將創建該對象的副本,並且您確實可以修改該對象,重新添加該對象,並在vector中獲取兩個不同的對象。但是Java不能這樣工作:對象類型的所有變量實質上都是指針。

在你的循環,填充列表,則需要每次都圍繞創建一個新的LiftData對象。

3

您只是在ArrayList中添加對象的引用。您稍後修改該對象,因此當然修改數組列表中的一個(它是相同的對象)。

隨着obj_LData =新LiftData();你正在創建一個與ArrayList中的對象不同的新對象,這就是它工作的原因。

LiftData obj_LData = new LiftData(); 
LiftData obj_LData2 = obj_LData; 

這裏,obj_LData和obj_LData2指向同一個對象。如果你改變其中一個屬性,另一個也會改變。

1

我認爲發生的事情如下: 因爲你不'new'你的自定義對象,你正在改變的變量(對於ArrayList的第二個元素)實際上是數組列表中的第一個元素,因爲它指向內存中的相同位置(通過引用)。

當「新」,你讓內存中的一個新的空間,並賦予其新的指針。因此,現在添加的第一個元素指向與您爲第二個元素編輯的位置不同的位置。

重新使用該變量很好,但在更改和添加之前需要更新,否則指針會相同。

LiftData toAdd; 
ArrayList<LiftData> list = new ArrayList<LiftData>(); 
for (int i=0;i<5;i++) { 
    //Without this line here, the pointers to all the elements of the array list will the same. 
    //This means that they will have the same values too 
    toAdd = new LiftData(); 
    //init lift data values 
    list.add(toAdd); 
}