我创建了一个TreeMap of <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中时,我将用相同的键更新现有的条目,即使该键现在是具有不同值的同一个类。
我的假设是正确的,还是有其他原因?除了为每个条目创建一个新的Calendar之外,还有其他更远的方法来实现这个目标吗?
发布于 2015-06-26 10:32:54
set方法不创建新的Calendar,它仍然是相同的,但是具有不同的值。因此,当您将它添加到Map中时,它只是将值作为其相同的键进行更新,您总是在引用同一个对象。您需要为每个键创建一个新实例。
发布于 2015-06-26 10:32:55
正如巴尔杜兹评论的那样:
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);https://stackoverflow.com/questions/31070122
复制相似问题