2015-06-26 85 views
2

我创建的<GregorianCalendar, Integer>一个TreeMap储存在GPS闰秒引入日期:TreeMap的

leapSecondsDict = new TreeMap<GregorianCalendar, Integer>(); 
GregorianCalendar calendar = 
    new GregorianCalendar(TimeZone.getTimeZone("UTC")); 

calendar.set(1981, GregorianCalendar.JUNE, 30, 23, 59, 59); 
leapSecondsDict.put(calendar, 1); 
calendar.set(1982, GregorianCalendar.JUNE, 30, 23, 59, 59); 
leapSecondsDict.put(calendar, 2); 
calendar.set(1983, GregorianCalendar.JUNE, 30, 23, 59, 59); 
leapSecondsDict.put(calendar, 3); 

的问题是,每一个我称之为放一次,TreeMap只包含最后一个插入的元素,并且尺寸保持为1.

这是为什么发生? 我的猜测是,当使用Calendar作为关键字时,关键是类实例id而不是它的值,所以当将第二个元素插入TreeMap时,我将用同一个关键字更新现有条目,即使该关键字现在是具有不同价值的同一班。

我的假设是对的还是有其他原因?除了为每个条目创建新的Calendar以外,还有其他更实用的方法吗?

+4

的'set'方法不创建一个新的'Calendar',它仍然是相同的,但用不同的值。因此,当你将它添加到Map中时,它只是将它的值更新为同一个键,你总是引用同一个对象。您需要为每个键创建一个新实例。 – Balduz

+0

@Balduz感谢您的澄清。你会回答,所以我可以接受吗? –

+0

完成,并感谢。 – Balduz

回答

2

set方法不会创建新的Calendar,它仍然是相同的,但具有不同的值。因此,当您将它添加到Map时,它只是将该值更新为相同的键,您始终引用相同的对象。您需要为每个键创建一个新实例。

3

由于Balduz评论:

set方法不创建一个新的日历,它仍然是相同的,但具有不同的值。因此,当您将它添加到Map中时,它只是将该值更新为同一个键,则始终引用同一个对象。您需要为每个键创建一个新实例。

所以,你应该创建一个新的每次是这样的:

GregorianCalendar calendar1 = new GregorianCalendar(1981, GregorianCalendar.JUNE, 30, 23, 59, 59); 
calendar1.setTimeZone(TimeZone.getTimeZone("UTC")); 
leapSecondsDict.put(calendar1, 1); 
GregorianCalendar calendar2 = new GregorianCalendar(1982, GregorianCalendar.JUNE, 30, 23, 59, 59); 
calendar2.setTimeZone(TimeZone.getTimeZone("UTC")); 
leapSecondsDict.put(calendar2, 2); 
GregorianCalendar calendar3 = new GregorianCalendar(1983, GregorianCalendar.JUNE, 30, 23, 59, 59); 
calendar3.setTimeZone(TimeZone.getTimeZone("UTC")); 
leapSecondsDict.put(calendar3, 3);