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
接口的方法。
不同之处在于HashMap
是Map
接口的实现。您可以说在大多数情况下使用Map
接口会更好,因为通常您不需要了解实现的细节并且这样您就可以立即交换实现。
这来自program to interfaces not implementations的一般准则。
请注意:
您应该在适用的情况下使用泛型。
【讨论】:
@Whomever 否决了:想解释一下吗?【参考方案2】:Map<K, V>
是一个接口,HashMap<K, V>
是一个实现接口的类。
我总是更喜欢第二种选择,除非你特别想要 HashMap<K, V>
的特征。
使用后一种方法,可以轻松地将HashMap<K, V>
切换为Map<K, V>
的另一个实现。
另一个针对接口进行编码的示例
以List<E>
vs ArrayList<E>
方法为例:
ArrayList<E> list = new ArrayList<>()
,则不能轻易将其更改为LinkedList<>()
,因为ArrayList<E> list = new LinkedList<>()
无法编译。
但是,如果您将其声明为 List<E> list = new ArrayList<>()
,那么您可以随时将其切换为 LinkedList<>()
。
在方法中针对接口进行编码的示例
假设您有一个接受List<E>
的方法,那么您应该怎么做?
-
设为
void method(ArrayList<E> list)
;
或设为void method(List<E> list)
现在您通常总是希望它是List<E>
,而您不关心列表的类型,而只关心List<E>
接口中可用的操作。
但是在某些情况下,您可能确实希望强制访问时间恒定,在这种情况下,只让您的方法接受 ArrayList<E>
很有意义,因为该实现提供了恒定的访问时间。
【讨论】:
【参考方案3】:据我从javadoc看,HashMap没有添加任何新方法,所以这两个类没有区别。
一般原则上,尽可能使用接口而不是类。
【讨论】:
以上是关于Map 和 HashMap [重复]的主要内容,如果未能解决你的问题,请参考以下文章