我所创建的以下地图之间的区别是什么(在另一个问题中,人们似乎可以互换地使用它们,我想知道它们是否/如何不同):

HashMap<String, Object> map = new HashMap<String, Object>();
Map<String, Object> map = new HashMap<String, Object>();

当前回答

你创建了相同的地图。

但是当你使用它的时候,你可以弥补这个差异。对于第一种情况,你将能够使用特殊的HashMap方法(但我不记得有什么真正有用的方法),并且你将能够将它作为HashMap参数传递:

public void foo (HashMap<String, Object) { ... }

...

HashMap<String, Object> m1 = ...;
Map<String, Object> m2 = ...;

foo (m1);
foo ((HashMap<String, Object>)m2); 

其他回答

加上投票最多的答案和上面许多强调“更通用,更好”的答案,我想再挖掘一点。

Map是一个结构契约,而HashMap是一个实现,它提供了自己的方法来处理不同的实际问题:如何计算索引,容量是多少以及如何增加它,如何插入,如何保持索引惟一,等等。

让我们看看源代码:

在Map中,我们有containsKey(对象键)方法:

boolean containsKey(Object key);

JavaDoc:

boolean java.util.Map.containsValue(Object value) Returns true if this map maps one or more keys to the specified value. More formally, returns true if and only if this map contains at least one mapping to a value v such that (value==null ? v==null : value.equals(v)). This operation will probably require time linear in the map size for most implementations of the Map interface. Parameters:value value whose presence in this map is to betested Returns:true if this map maps one or more keys to the specified valueThrows: ClassCastException - if the value is of an inappropriate type for this map (optional) NullPointerException - if the specified value is null and this map does not permit null values (optional)

它需要它的实现来实现它,但“如何”是自由的,只是为了确保它返回正确的结果。

在HashMap:

public boolean containsKey(Object key) {
    return getNode(hash(key), key) != null;
}

事实证明,HashMap使用hashcode来测试这个映射是否包含键。所以它有哈希算法的优点。

HashMap是Map的一个实现,所以它是完全相同的,但有“clone()”方法,因为我在参考指南中看到))

Map是接口,Hashmap是实现接口的类。

在这个实现中,你创建了相同的对象

在第二个示例中,“map”引用的类型是map,它是由HashMap(和其他类型的map)实现的接口。这个接口是一个契约,表示对象将键映射到值,并支持各种操作(例如put, get)。它没有提到Map(在本例中是HashMap)的实现。

第二种方法通常是首选的,因为您通常不希望将特定的映射实现公开给使用map或通过API定义的方法。

Map是HashMap实现的接口。不同之处在于,在第二个实现中,对HashMap的引用将只允许使用Map接口中定义的函数,而第一个实现将允许使用HashMap中的任何公共函数(包括Map接口)。

如果您阅读Sun的界面教程,可能会更有意义