简体   繁体   中英

ArrayList passing by reference with dates object?

I pass dates to an ArrayList but when I change the Date object, all the Date s inside the ArrayList will change. This is an example:

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());

This will print:

[Mon Jun 13 00:00:00 EDT 2011, Mon Jun 13 00:00:00 EDT 2011, Mon Jun 13 00:00:00 EDT 2011]

Any idea of why this happening and how could I solve it?

This is because the variable currentDate references a single instance of Date , which you have added to the list many times. When you call currentDate.setDate(currentDate.getDate() + 1) you're simply updating that same object's state, and every time you call datesList.add(currentDate) that same object is added to the ArrayList .

Also note that setDate() and getDate() are deprecated methods. You should look into using a Calendar for date manipulation:

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());

or better yet, Joda Time .

You're repeatedly adding references to the same object, so you end up with a list that contains multiple references to that same object.

Try adding copies instead:

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

List datesList has the same instance in all positions. It's the same Date instance instantiated at Date currentDate = new Date("6/10/2011"); . Try cloning it with clone() , and modify & add each clone to the list.

   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());

By doing this, each time you do currentDate = currentDate.clone() , you're assigning a new instance of Date with the same properties to the variable currentDate , while not modifying the original instances already added to the list.

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());

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM