2011-09-28 2 views
0

날짜를 ArrayList으로 전달하지만 Date 개체를 변경하면 ArrayList 안에있는 Date이 모두 변경됩니다. 이 인쇄됩니다ArrayList가 dates 객체와 함께 참조로 전달됩니까?

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 인스턴스가 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에 동일한 특성을 가진 Date새로운 인스턴스를 할당하고 있습니다.

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()); 
관련 문제