Java 中的 Hashmap VS Map [重复]

问题描述 投票:0回答:3

可能重复:
Java - HashMap 与 Map 对象

有什么区别:

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

VS

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

问候,罗恩

java dictionary hashmap
3个回答
9
投票

物体之间没有区别。对象的接口存在差异。在第一种情况下,界面是

HashMap<String, Object>
,而在第二种情况下,界面是
Map<String, Object>
。但底层对象是相同的。

使用

Map<String, Object>
的优点是,您可以将底层对象更改为不同类型的映射,而不会破坏与使用它的任何代码的约定。如果你声明为
HashMap<String, Object>
,如果你想改变底层实现,你就必须改变你的合约...


另外,

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

这种针对接口而不是实现进行编程的做法具有保持灵活性的额外好处:例如,您可以在运行时替换映射的动态类型,只要它是

Map
的子类型(例如
LinkedHashMap
),并且即时更改地图的行为。

一个好的经验法则是在 API 级别上尽可能保持抽象:例如,如果您正在编程的方法必须在映射上工作,那么将参数声明为

Map
就足够了,而不是更严格(因为不太抽象) )
HashMap
类型。这样,API 的使用者就可以灵活地选择他们想要传递给您的方法的
Map
实现类型..


3
投票

区别在于:当您使用

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

这是一件好事!

编辑:阅读本文 - “编程到接口”是什么意思?


2
投票

补充一点。

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

所以,如果你使用:

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

那么你就不能使用:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.