我创建了一个 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 回答
set
方法不会创建新的Calendar
,它仍然是相同的但具有不同的值 . 因此,当您将其添加到Map
时,它只是将值更新为相同的键,您始终引用相同的对象 . 您需要为每个键创建一个新实例 .正如Balduz评论的那样:
所以,你应该每次创建一个新的,例如: