簡體   English   中英

ArrayList通過引用傳遞與日期對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM