2015-06-26 64 views
2

我創建的<GregorianCalendar, Integer>一個TreeMap儲存在GPS閏秒引入日期:TreeMap的

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); 

的問題是,每一個我稱之爲放一次,TreeMap只包含最後一個插入的元素,並且尺寸保持爲1.

這是爲什麼發生? 我的猜測是,當使用Calendar作爲關鍵字時,關鍵是類實例id而不是它的值,所以當將第二個元素插入TreeMap時,我將用同一個關鍵字更新現有條目,即使該關鍵字現在是具有不同價值的同一班。

我的假設是對的還是有其他原因?除了爲每個條目創建新的Calendar以外,還有其他更實用的方法嗎?

+4

的'set'方法不創建一個新的'Calendar',它仍然是相同的,但用不同的值。因此,當你將它添加到Map中時,它只是將它的值更新爲同一個鍵,你總是引用同一個對象。您需要爲每個鍵創建一個新實例。 – Balduz

+0

@Balduz感謝您的澄清。你會回答,所以我可以接受嗎? –

+0

完成,並感謝。 – Balduz

回答

2

set方法不會創建新的Calendar,它仍然是相同的,但具有不同的值。因此,當您將它添加到Map時,它只是將該值更新爲相同的鍵,您始終引用相同的對象。您需要爲每個鍵創建一個新實例。

3

由於Balduz評論:

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);