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

有什么区别?请看下文。

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

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

它们可以互换吗?

【问题讨论】:

标签: java


【解决方案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; 的方法,那么您应该怎么做?

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-02-28
      • 1970-01-01
      • 2012-03-20
      • 2011-07-05
      • 2019-12-03
      • 2015-06-01
      • 2013-02-26
      • 2012-03-24
      • 2016-04-22
      相关资源
      最近更新 更多