可能重复:
Java - HashMap 与 Map 对象
有什么区别:
Map <String,Integer>myMap = new HashMap<String,Integer>();
VS
HashMap <String,Integer> map = new HashMap<String,Integer>();
问候,罗恩
物体之间没有区别。对象的接口存在差异。在第一种情况下,界面是
HashMap<String, Object>
,而在第二种情况下,界面是 Map<String, Object>
。但底层对象是相同的。
使用
Map<String, Object>
的优点是,您可以将底层对象更改为不同类型的映射,而不会破坏与使用它的任何代码的约定。如果你声明为HashMap<String, Object>
,如果你想改变底层实现,你就必须改变你的合约...
另外,
Map
是静态类型的地图,而HashMap
是动态类型的地图。这意味着编译器会将您的映射对象视为 Map
类型之一,即使在运行时,它可能指向它的任何子类型...
这种针对接口而不是实现进行编程的做法具有保持灵活性的额外好处:例如,您可以在运行时替换映射的动态类型,只要它是
Map
的子类型(例如 LinkedHashMap
),并且即时更改地图的行为。
一个好的经验法则是在 API 级别上尽可能保持抽象:例如,如果您正在编程的方法必须在映射上工作,那么将参数声明为
Map
就足够了,而不是更严格(因为不太抽象) ) HashMap
类型。这样,API 的使用者就可以灵活地选择他们想要传递给您的方法的 Map
实现类型..
补充一点。
将变量声明为Map会阻止您使用HashMap类提供的clone()方法。
所以,如果你使用:
Map <String,Integer>myMap = new HashMap<String,Integer>();
那么你就不能使用:
Map<String,Integer> myMap2 = myMap.clone();
除此之外,它们非常可以互换。