GregorianCalendars 的 TreeMap
TreeMap of GregorianCalendars
我创建了一个 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
作为键时,键是 class 实例 ID 而不是它的值,所以当将第二个元素插入 TreeMap
时,我会更新一个具有相同键的现有条目,即使该键现在相同 class 但值不同。
我的推测对吗,还是有其他原因?除了为每个条目创建一个新的 Calendar
之外,还有什么更好的方法可以实现这一点?
set
方法不会创建新的 Calendar
,它仍然是相同的,但具有不同的值。因此,当您将它添加到 Map
时,它只是将值更新为其相同的键,您始终引用相同的对象。您需要为每个键创建一个新实例。
正如 Balduz 评论的那样:
The set method does not create a new Calendar, it is still the same but with a different value. Therefore, when you add it to the Map it simply updates the value as its the same key, you are always referencing the same object. You need to create a new instance for each of the keys.
因此,您应该每次都创建一个新的,例如:
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);
我创建了一个 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
作为键时,键是 class 实例 ID 而不是它的值,所以当将第二个元素插入 TreeMap
时,我会更新一个具有相同键的现有条目,即使该键现在相同 class 但值不同。
我的推测对吗,还是有其他原因?除了为每个条目创建一个新的 Calendar
之外,还有什么更好的方法可以实现这一点?
set
方法不会创建新的 Calendar
,它仍然是相同的,但具有不同的值。因此,当您将它添加到 Map
时,它只是将值更新为其相同的键,您始终引用相同的对象。您需要为每个键创建一个新实例。
正如 Balduz 评论的那样:
The set method does not create a new Calendar, it is still the same but with a different value. Therefore, when you add it to the Map it simply updates the value as its the same key, you are always referencing the same object. You need to create a new instance for each of the keys.
因此,您应该每次都创建一个新的,例如:
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);