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

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

当前回答

Map有以下实现:

HashMap Map m = new HashMap(); LinkedHashMap映射m = new LinkedHashMap(); TreeMap Map m = new TreeMap(); WeakHashMap映射m = new WeakHashMap();

假设您已经创建了一个方法(这只是伪代码)。

public void HashMap getMap(){
   return map;
}

假设你的项目需求改变了:

该方法应该返回映射内容-需要返回HashMap。 该方法应该返回映射键的插入顺序-需要改变返回类型HashMap到LinkedHashMap。 该方法应该按顺序返回映射键-需要将返回类型LinkedHashMap更改为TreeMap。

如果您的方法返回特定的类,而不是实现Map接口的东西,那么您每次都必须更改getMap()方法的返回类型。

但是如果您使用Java的多态性特性,而不是返回特定的类,而是使用接口Map,它将提高代码的可重用性并减少需求更改的影响。

其他回答

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

你创建了相同的地图。

但是当你使用它的时候,你可以弥补这个差异。对于第一种情况,你将能够使用特殊的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 m = new HashMap(); LinkedHashMap映射m = new LinkedHashMap(); TreeMap Map m = new TreeMap(); WeakHashMap映射m = new WeakHashMap();

假设您已经创建了一个方法(这只是伪代码)。

public void HashMap getMap(){
   return map;
}

假设你的项目需求改变了:

该方法应该返回映射内容-需要返回HashMap。 该方法应该返回映射键的插入顺序-需要改变返回类型HashMap到LinkedHashMap。 该方法应该按顺序返回映射键-需要将返回类型LinkedHashMap更改为TreeMap。

如果您的方法返回特定的类,而不是实现Map接口的东西,那么您每次都必须更改getMap()方法的返回类型。

但是如果您使用Java的多态性特性,而不是返回特定的类,而是使用接口Map,它将提高代码的可重用性并减少需求更改的影响。

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

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

我只是想把它作为对已接受答案的评论,但它太时髦了(我讨厌没有换行符)

啊,所以区别在于 一般来说,Map有一定的方法 与之相关。但是有 不同的方式或创建地图,如 作为HashMap,以及这些不同的方式 提供唯一的方法 地图。

正是如此——您总是希望尽可能使用最通用的接口。考虑一下数组列表和LinkedList。在你使用它们的方式上有巨大的差异,但如果你使用“列表”,你可以很容易地在它们之间切换。

实际上,可以用更动态的语句替换初始化式的右边。这样怎么样:

List collection;
if(keepSorted)
    collection=new LinkedList();
else
    collection=new ArrayList();

这样,如果您要用插入排序填充集合,您将使用链表(插入排序到数组列表是违法的)。但如果你不需要保持它的排序,只是追加,你使用ArrayList(更有效的其他操作)。

这是一个相当大的扩展,因为集合不是最好的例子,但在OO设计中,最重要的概念之一是使用接口外观来访问使用完全相同的代码的不同对象。

编辑回应评论:

对于下面的map注释,是的,使用“map”接口限制你只能使用这些方法,除非你将集合从map转换回HashMap(这完全违背了目的)。

通常你要做的是创建一个对象,并使用它的特定类型(HashMap)填充它,在某种“create”或“initialize”方法中,但该方法将返回一个“Map”,不再需要作为HashMap进行操作。

如果你不得不强制转换,你可能使用了错误的接口,或者你的代码结构不够好。请注意,代码的一部分将其作为“HashMap”,而另一部分将其作为“Map”,这是可以接受的,但这应该是“向下”的。这样你就不会选角了。

还要注意由接口指示的角色的半整洁方面。LinkedList是一个很好的堆栈或队列,ArrayList是一个很好的堆栈,但是一个可怕的队列(同样,删除会导致整个列表的移位),所以LinkedList实现了队列接口,ArrayList没有。