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