Java中的Hashmap VS Map

时间:2012-03-02 06:17:30

标签: java map hashmap

  

可能重复:
  Java - HashMap vs Map objects

有什么区别:

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

VS

HashMap <String,Integer> map = new HashMap<String,Integer>();  

的问候,罗恩

3 个答案:

答案 0 :(得分:4)

对象之间没有区别。您对该对象的界面有所不同。在第一种情况下,界面为HashMap<String, Object>,而在第二种情况下,界面为Map<String, Object>。但是,底层对象是相同的。

使用Map<String, Object>的好处是,您可以将基础对象更改为不同类型的地图,而不会违反与使用它的任何代码的合同。如果您将其声明为HashMap<String, Object>,则如果要更改基础实施,则必须更改合同...


此外,Map是静态类型的地图,而HashMap是地图的动态类型。这意味着编译器会将您的地图对象视为类型Map之一,即使在运行时,它也可能指向它的任何子类型......

这种针对接口而不是实现进行编程的做法具有保持灵活性的额外好处:例如,您可以在运行时替换动态类型的map,只要它是Map的子类型(例如{{ 1}}),并动态更改地图的行为。

一个好的经验法则是在API级别保持尽可能抽象:例如,如果您编程的方法必须在地图上工作,那么将参数声明为LinkedHashMap而不是更严格就足够了(因为不太抽象)Map类型。这样,您的API的使用者可以灵活地了解他们希望将哪种HashMap实现传递给您的方法。

答案 1 :(得分:2)

区别在于:

当您使用Map作为类型时,您可以将实现(HashMap)切换到其他类型!

这是一件好事!

编辑:阅读本文 - What does it mean to "program to an interface"?

答案 2 :(得分:2)

还有一点。

将变量声明为Map会阻止您使用HashMap类提供的clone()方法。

所以,如果您使用:

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

然后你不能使用:

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

除此之外,它们可以互换。