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

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

当前回答

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

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

其他回答

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

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

Map是静态类型的映射,而HashMap是动态类型的映射。这意味着编译器将把您的map对象视为map类型之一,即使在运行时,它可能指向它的任何子类型。

这种针对接口而不是实现进行编程的实践具有保持灵活性的额外好处:例如,您可以在运行时替换映射的动态类型,只要它是map的子类型(例如LinkedHashMap),并动态地更改映射的行为。

一个好的经验法则是在API级别上尽可能保持抽象:例如,如果您正在编程的方法必须在Map上工作,那么将参数声明为Map而不是更严格的(因为不太抽象)HashMap类型就足够了。这样,API的使用者就可以灵活地决定他们想要传递给方法的Map实现的类型。

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

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

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

你创建了相同的地图。

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

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

...

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

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