2011-09-28 49 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());