2012-03-02 38 views

回答

4

有對象沒有什麼區別。您在該對象上的界面有所不同。在第一種情況下,界面爲HashMap<String, Object>,而第二種情況爲Map<String, Object>。但是,底層對象是相同的。

使用Map<String, Object>的好處是,您可以將底層對象更改爲不同種類的地圖,而不會違反使用它的任何代碼的約定。如果你把它聲明爲HashMap<String, Object>,你必須改變你的合同,如果你想改變底層的實現......


而且Map是靜態類型的地圖,而HashMap是動態類型的地圖。這意味着編譯器會將您的映射對象視爲Map類型之一,即使在運行時它可能指向它的任何子類型...

這種針對接口而不是實現編程的做法具有額外的好處保持靈活性:例如,您可以在運行時替換動態類型的地圖,只要它是Map的子類型(例如LinkedHashMap),並即時更改地圖的行爲。

一個很好的經驗法則是在API級別保持儘可能抽象:如果您正在編程的方法必須在地圖上工作,那麼聲明參數爲Map而不是更嚴格(因爲更少摘要)HashMap類型。這樣,您的API的消費者可以靈活地將他們想要傳遞給您的方法的實施方式設爲何種類型。

+0

非常感謝您的幫助!我不明白爲什麼人們反對這個問題,我認爲了解我們使用的數據結構之間的差異非常重要。再次,謝謝! – ron 2012-03-02 06:41:56

+0

歡迎您.. – 2012-03-02 06:45:26

2

還有一點。

將變量聲明爲Map可防止使用由HashMap類提供的clone()方法。

所以,如果你使用:

Map <String,Integer>myMap = new HashMap<String,Integer>(); 

那麼你就不能使用:

Map<String,Integer> myMap2 = myMap.clone(); 

除此之外,他們幾乎可以互換。