2011-09-28 51 views
0

我將日期傳遞給ArrayList,但是當我更改Date對象時,ArrayList內部的所有Date都將更改。這是一個例子:ArrayList通過日期對象引用傳遞?

Date currentDate = new Date("6/10/2011"); 
ArrayList<Date> datesList = new ArrayList(); 

currentDate.setDate(currentDate.getDate() + 1); 
datesList.add(currentDate); 

currentDate.setDate(currentDate.getDate() + 1); 
datesList.add(currentDate); 

currentDate.setDate(currentDate.getDate() + 1); 
datesList.add(currentDate); 

System.out.println(datesList.toString()); 

這將打印:

[Mon Jun 13 00:00:00 EDT 2011, Mon Jun 13 00:00:00 EDT 2011, Mon Jun 13 00:00:00 EDT 2011] 

爲什麼出現這種情況怎麼可能我解決這個問題的任何想法?

+2

那麼,你期待什麼樣的輸出?您將引用傳遞給同一個對象三次,並最終獲得一個包含該對象三次的集合。 –

回答

3

這是因爲變量currentDate引用了您已多次添加到列表中的單個實例Date。當您撥打currentDate.setDate(currentDate.getDate() + 1)時,您只需更新相同對象的狀態,並且每次撥打datesList.add(currentDate)時,都會將同一對象添加到ArrayList

另請注意,setDate()getDate()是不推薦使用的方法。你應該考慮使用日期操縱Calendar

Calendar cal = Calendar.getInstance(); 
cal.set(2011, 5, 10); 

ArrayList<Date> datesList = new ArrayList<Date>(); 

datesList.add(cal.getTime()); 

cal.add(Calendar.DATE, 1); 
datesList.add(cal.getTime()); 

cal.add(Calendar.DATE, 1); 
datesList.add(cal.getTime()); 

System.out.println(datesList.toString()); 

或更好,但Joda Time

3

您不斷添加對同一對象的引用,因此您最終得到一個包含對同一對象的多個引用的列表。

嘗試增加拷貝,而不是:

currentDate.setDate(currentDate.getDate()+1) 
datesList.add(currentDate.clone());   // note the .clone() 
0

列表datesList在所有位置相同的實例。這與在Date currentDate = new Date("6/10/2011");實例化的實例相同Date。嘗試使用clone()克隆它,並修改&將每個克隆添加到列表中。

ArrayList<Date> datesList = new ArrayList(); 

    Date currentDate = new Date("6/10/2011"); ; 
    currentDate.setDate(currentDate.getDate()+1); 
    datesList.add(currentDate); 

    currentDate = currentDate.clone(); 
    currentDate.setDate(currentDate.getDate()+1); 
    datesList.add(currentDate); 

    currentDate = currentDate.clone(); 
    currentDate.setDate(currentDate.getDate()+1); 
    datesList.add(currentDate); 

    System.out.println(datesList.toString()); 

通過這樣做,每次你做currentDate = currentDate.clone()時候,你要指定的Date具有相同屬性的變量currentDate一個實例,而不是修改已經添加到列表中的原始實例。

0
int dateNum = 3; 
ArrayList<Date> datesList = new ArrayList(); 

for(int x = 0; x < dateNum; x++){ 
    Date currentDate = new Date("6/10/2011"); //Creating a new object so your not pointing to the same one in memory 
    currentDate.setDate(currentDate.getDate()+1); 
    datesList.add(currentDate); 
} 

    System.out.println(datesList.toString());