2014-09-26 64 views
2

我在使用Java中的类GregorianCalendar时遇到问题。 为什么方法get更改我的变量GregorianCalendar方法获取类GregorianCalendar?

我做这项工作:

System.out.println(timestart); 
second = timestart.get(GregorianCalendar.SECOND); 
System.out.println(timestart); 

输出是:

,HOUR_OF_DAY=15,MINUTE=37,SECOND=16,MILLISECOND=794140,ZONE_OFFSET=?,DST_OFFSET=?] 
,HOUR=3,HOUR_OF_DAY=15,MINUTE=50,SECOND=30,MILLISECOND=0,ZONE_OFFSET=3600000,DST_OFFSET=3600000] 

为了简单起见,我已经展示了输出的有趣的部分。 我期望这两张照片能得到相同的结果,但不是这样。

+1

向我们展示了timestart的实例 – kai 2014-09-26 10:21:37

+0

运行这段代码(''timestart'用'new GregorianCalendar()'初始化))我看到两个相同的字符串产生了。是否有其他线程在'timestart'变量引用的对象上运行? (你是否与其他线程共享对象?) – Bobulous 2014-09-26 10:23:46

+1

确实是时间开始'GregorianCalendar'? :> :) – Antoniossss 2014-09-26 10:24:42

回答

1

综观GregorianCalendarCalendar的源代码,你可以看到,get首先调用一个名为complete它要么调用updateTimecomputeFields方法 - 计算像分,秒等基于日历的时间戳字段的方法。

无论何时更改值,所有字段都将失效。域似乎只在访问时重新计算,假设您从未不使用它们,可避免不必要的计算。所以基本上它是懒加载这些领域。

另一方面,toString方法只是打印所有值,而无需重新计算任何内容。因此,在您的代码中,第一个输出可能会显示无效的旧值。如果是这种情况,那么您应该在第一个输出的省略部分看到类似areFieldsSet=false的内容。