【发布时间】:2014-05-14 04:50:47
【问题描述】:
有什么区别?请看下文。
HashMap<Integer, String> hashMap = new HashMap<Integer, String>();
和
Map<Integer, String> hashMap = new HashMap<Integer, String();
它们可以互换吗?
【问题讨论】:
标签: java
有什么区别?请看下文。
HashMap<Integer, String> hashMap = new HashMap<Integer, String>();
和
Map<Integer, String> hashMap = new HashMap<Integer, String();
它们可以互换吗?
【问题讨论】:
标签: java
区别在于变量hashMap。如果你像这样创建它:
HashMap hashMap = new HashMap();
您将能够使用HashMap 的所有方法。
如果你像这样创建它:
Map hashMap = new HashMap();
那么你将被限制为Map接口的方法。
不同之处在于HashMap 是Map 接口的实现。您可以说在大多数情况下使用Map 接口会更好,因为通常您不需要了解实现的细节并且这样您就可以立即交换实现。
这来自program to interfaces not implementations的一般准则。
请注意:
您应该在适用的情况下使用泛型。
【讨论】:
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> 很有意义,因为该实现提供了恒定的访问时间。
【讨论】:
据我从javadoc看,HashMap没有添加任何新方法,所以这两个类没有区别。
一般原则上,尽可能使用接口而不是类。
【讨论】: