2015-08-08 37 views
1

我有:今天的日期对象。在ArrayList中存储Java日历会导致意外的行为

我需要什么:存放一周包含的日期在一个ArrayList。

有什么我想:

public static void main(String[] args) { 

    Date today = new Date(); 

    Calendar cal = Calendar.getInstance(); 
    cal.setFirstDayOfWeek(Calendar.MONDAY); 
    cal.setTime(today); 

    List<Calendar> daysOfWeek = new ArrayList<>(); 

    IntStream 
      .iterate(2, n -> n+1) 
      .limit(7) 
      .forEach(n -> 
       { 
        if(n != 8){ 
         cal.set(Calendar.DAY_OF_WEEK, n); 
        }else{ 
         cal.set(Calendar.DAY_OF_WEEK, 1); 
        } 
        System.out.println("CAL_INSIDE: " + cal.getTime()); 
        daysOfWeek.add(cal); 
       }); 
      System.out.println(""); 
      daysOfWeek.stream().forEach(cal -> System.out.println("CAL_OUTSIDE: " + cal.getTime())); 
} 

内的foreach语句中我得到正是我想要的。但ArrayList似乎只包含最后一个日期。 输出:

CAL_INSIDE: Mon Aug 03 14:35:37 CEST 2015 
CAL_INSIDE: Tue Aug 04 14:35:37 CEST 2015 
CAL_INSIDE: Wed Aug 05 14:35:37 CEST 2015 
CAL_INSIDE: Thu Aug 06 14:35:37 CEST 2015 
CAL_INSIDE: Fri Aug 07 14:35:37 CEST 2015 
CAL_INSIDE: Sat Aug 08 14:35:37 CEST 2015 
CAL_INSIDE: Sun Aug 09 14:35:37 CEST 2015 

CAL_OUTSIDE: Sun Aug 09 14:35:37 CEST 2015 
CAL_OUTSIDE: Sun Aug 09 14:35:37 CEST 2015 
CAL_OUTSIDE: Sun Aug 09 14:35:37 CEST 2015 
CAL_OUTSIDE: Sun Aug 09 14:35:37 CEST 2015 
CAL_OUTSIDE: Sun Aug 09 14:35:37 CEST 2015 
CAL_OUTSIDE: Sun Aug 09 14:35:37 CEST 2015 
CAL_OUTSIDE: Sun Aug 09 14:35:37 CEST 2015 

基本上,我得到了我想要什么,但...

问:为什么只有星期天存储在ArrayList中?我错过了什么?

CAL_INSIDE: Mon Aug 03 14:51:31 CEST 2015 
CAL_INSIDE: Tue Aug 04 14:51:31 CEST 2015 
CAL_INSIDE: Wed Aug 05 14:51:31 CEST 2015 
CAL_INSIDE: Thu Aug 06 14:51:31 CEST 2015 
CAL_INSIDE: Fri Aug 07 14:51:31 CEST 2015 
CAL_INSIDE: Sat Aug 08 14:51:31 CEST 2015 
CAL_INSIDE: Sun Aug 09 14:51:31 CEST 2015 

CAL_OUTSIDE: Mon Aug 03 14:51:31 CEST 2015 
CAL_OUTSIDE: Tue Aug 04 14:51:31 CEST 2015 
CAL_OUTSIDE: Wed Aug 05 14:51:31 CEST 2015 
CAL_OUTSIDE: Thu Aug 06 14:51:31 CEST 2015 
CAL_OUTSIDE: Fri Aug 07 14:51:31 CEST 2015 
CAL_OUTSIDE: Sat Aug 08 14:51:31 CEST 2015 
CAL_OUTSIDE: Sun Aug 09 14:51:31 CEST 2015 
+0

由于日历不是不可变的附加信息,无法重复吗? – SklogW

+0

如果它是不可变的,那么您将无法像您那样做(您将无法更改现有对象中的字段),因此不会出现这种情况。所以它肯定是我提到的同样的问题。 – RealSkeptic

+0

你是对的。感谢您的输入 – SklogW

回答

3

日历是一个可变的对象,所以你只是存储引用到该对象并CAL_OUTSIDE只给你的7倍,最后内部状态:

根据公认的答案编辑

输出一个引用Calendar对象。

你必须移动

Calendar cal = Calendar.getInstance(); 
cal.setFirstDayOfWeek(Calendar.MONDAY); 
cal.setTime(today); 

你的循环中得到7个不同的Calendar对象。

+0

刚刚尝试过,它的工作原理。谢谢你,先生。我会尽快接受。 – SklogW