我将日期传递给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]
知道为什么会发生这种情况以及如何解决它?
答案 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());