Map 和 HashMap [重复]

Posted

技术标签:

【中文标题】Map 和 HashMap [重复]【英文标题】:Map and HashMap [duplicate] 【发布时间】:2014-05-14 04:50:47 【问题描述】:

有什么区别?请看下文。

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

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

它们可以互换吗?

【问题讨论】:

***.com/questions/1348199/java-hashmap-vs-map-objects 【参考方案1】:

区别在于变量hashMap。如果你像这样创建它:

HashMap hashMap = new HashMap();

您将能够使用HashMap 的所有方法。

如果你像这样创建它:

Map hashMap = new HashMap();

那么你将被限制为Map接口的方法。

不同之处在于HashMapMap 接口的实现。您可以说在大多数情况下使用Map 接口会更好,因为通常您不需要了解实现的细节并且这样您就可以立即交换实现。

这来自program to interfaces not implementations的一般准则。

请注意:

您应该在适用的情况下使用泛型

【讨论】:

@Whomever 否决了:想解释一下吗?【参考方案2】:

Map&lt;K, V&gt; 是一个接口HashMap&lt;K, V&gt; 是一个实现接口的

我总是更喜欢第二种选择,除非你特别想要 HashMap&lt;K, V&gt; 的特征。

使用后一种方法,可以轻松地将HashMap&lt;K, V&gt; 切换为Map&lt;K, V&gt; 的另一个实现。

另一个针对接口进行编码的示例

List&lt;E&gt; vs ArrayList&lt;E&gt; 方法为例:

如果将其定义为ArrayList&lt;E&gt; list = new ArrayList&lt;&gt;(),则不能轻易将其更改为LinkedList&lt;&gt;(),因为ArrayList&lt;E&gt; list = new LinkedList&lt;&gt;() 无法编译。 但是,如果您将其声明为 List&lt;E&gt; list = new ArrayList&lt;&gt;(),那么您可以随时将其切换为 LinkedList&lt;&gt;()

在方法中针对接口进行编码的示例

假设您有一个接受List&lt;E&gt; 的方法,那么您应该怎么做?

    设为void method(ArrayList&lt;E&gt; list); 或设为void method(List&lt;E&gt; list)

现在您通常总是希望它是List&lt;E&gt;,而您关心列表的类型,而只关心List&lt;E&gt; 接口中可用的操作。

但是在某些情况下,您可能确实希望强制访问时间恒定,在这种情况下,只让您的方法接受 ArrayList&lt;E&gt; 很有意义,因为该实现提供了恒定的访问时间。

【讨论】:

【参考方案3】:

据我从javadoc看,HashMap没有添加任何新方法,所以这两个类没有区别。

一般原则上,尽可能使用接口而不是类。

【讨论】:

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

当我从map和hashmap创建对象时有啥区别[重复]

Java中的Map和HashMap [重复]

HashMap详解

Java中的Hashmap VS Map [重复]

LinkedHashMap和HashMap的比较使用

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