Java中的Hashmap VS Map [重复]

Posted

技术标签:

【中文标题】Java中的Hashmap VS Map [重复]【英文标题】:Hashmap VS Map in Java [duplicate] 【发布时间】:2012-03-20 16:43:28 【问题描述】:

可能重复:Java - HashMap vs Map objects

两者有什么区别:

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

VS

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

问候,罗恩

【问题讨论】:

第一个相关问题***.com/q/1348199/272742。使用搜索 【参考方案1】:

区别在于:

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

这是一件好事!

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

【讨论】:

【参考方案2】:

对象之间没有区别。您对对象的接口有所不同。在第一种情况下,接口是HashMap&lt;String, Object&gt;,而在第二种情况下,它是Map&lt;String, Object&gt;。但是,底层对象是相同的。

使用Map&lt;String, Object&gt; 的优势在于,您可以将底层对象更改为不同类型的映射,而不会违反使用它的任何代码的合同。如果你声明为HashMap&lt;String, Object&gt;,如果你想改变底层实现,你必须改变你的合同......


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

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

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

【讨论】:

非常感谢您的帮助!我不明白为什么人们投票反对这个问题,我认为了解我们使用的数据结构之间的差异非常重要。再次感谢! 所以好处是可以从 Map myVar = new HashMap();类似于 Map myVar = new HashTree();?或类似的东西?如果您决定要更改某些内容,它只是允许您更轻松地重写代码?嗯......这很奇怪,你甚至需要声明类型开始。这有点像 T myVar 情况? Map 只是抽象的并且允许您只声明没有对象结构的类型,然后再担心呢?我在正确的道路上吗?【参考方案3】:

加分。

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

所以,如果你使用:

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

那你就不能用了:

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

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

【讨论】:

以上是关于Java中的Hashmap VS Map [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java中HashMap和Map之间的区别..? [复制]

新手小白学JAVA Set HashSet Map HashMap

Java HashMap 机制 [重复]

Java数据结构系列——HashMap的常见方法

java map的key可以重复吗

hashmap的key可以重复吗