2012-03-02 54 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(); 

除此之外,他们几乎可以互换。