[英]ArrayList passing by reference with dates object?
我將日期傳遞給ArrayList
但是當我更改Date
對象時, ArrayList
所有Date
都將改變。 這是一個例子:
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]
是否知道為什么會發生這種情況以及如何解決?
這是因為變量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 。
您要反復添加對同一對象的引用,因此最終得到一個包含對同一對象的多個引用的列表。
嘗試添加副本:
currentDate.setDate(currentDate.getDate()+1)
datesList.add(currentDate.clone()); // note the .clone()
列出datesList
在所有位置都具有相同的實例。 這是在Date currentDate = new Date("6/10/2011");
實例化的同一Date
實例Date currentDate = new Date("6/10/2011");
。 嘗試使用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()
,您currentDate = currentDate.clone()
具有相同屬性的Date
的新實例分配給變量currentDate
,而不修改已添加到列表中的原始實例。
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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.