ArrayList通过引用传递日期对象?

时间:2011-09-28 14:58:51

标签: java arraylist

我将日期传递给ArrayList但是当我更改Date对象时,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]

知道为什么会发生这种情况以及如何解决它?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

您反复添加对同一对象的引用,因此您最终会得到一个包含对同一对象的多个引用的列表。

尝试添加副本:

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

答案 2 :(得分:0)

列表datesList在所有位置都有相同的实例。它与Date处实例化的Date currentDate = new Date("6/10/2011");实例相同。尝试使用clone()克隆它,并修改&amp;将每个克隆添加到列表中。

   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实例,而不是修改已添加到列表中的原始实例。

答案 3 :(得分: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());