首页 文章

GregorianCalendars的TreeMap

提问于
浏览
2

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

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 时,我将使用相同的键更新现有条目,即使该键是现在是同一个具有不同 Value 的类 .

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

2 回答

  • 2

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

  • 3

    正如Balduz评论的那样:

    set方法不会创建新的Calendar,它仍然是相同的但具有不同的值 . 因此,当您将其添加到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);
    

相关问题