首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TreeMap of GregorianCalendars

TreeMap of GregorianCalendars
EN

Stack Overflow用户
提问于 2015-06-26 09:52:42
回答 2查看 90关注 0票数 2

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

代码语言:javascript
复制
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);

问题是,每次调用put时,TreeMap只包含最后插入的元素,并且大小保持为1。

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

我的假设是正确的,还是有其他原因?除了为每个条目创建一个新的Calendar之外,还有其他更远的方法来实现这个目标吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-26 10:32:54

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

票数 2
EN

Stack Overflow用户

发布于 2015-06-26 10:32:55

正如巴尔杜兹评论的那样:

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

因此,您应该每次创建一个新的,如下所示:

代码语言:javascript
复制
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);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31070122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档