Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java日历存储在ArrayList中会导致意外行为_Java - Fatal编程技术网

将Java日历存储在ArrayList中会导致意外行为

将Java日历存储在ArrayList中会导致意外行为,java,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

我拥有的:今天的日期对象

我需要什么:在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()));
}
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

Calendar是一个可变对象,因此您只需存储对该对象的引用,
CAL_OUTSIDE
仅为您提供被引用的
Calendar
对象的上一次内部状态的7倍

你得走了

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

在循环中获得7个不同的
日历
对象。

刚刚尝试过,效果不错。谢谢你,好先生。我会尽快接受。由于日历不是不可变的附加信息,所以不重复如何?如果日历是不可变的,您将无法按照您的方式进行操作(您将无法更改现有对象中的字段),因此不会出现这种情况。所以这当然和我提到的问题是一样的,你是对的。感谢您的输入作为经验法则,对于
日历
永远不要存储它,返回它或将它用作参数,使用
日期
(或者正确克隆
日历
,如果您没有其他选择)存储的日历对象存储在列表中,以便作为参数传递,这合法吗?