Java中的Hashmap与Map

Java中的Hashmap与Map,java,map,hashmap,Java,Map,Hashmap,可能重复: 这两者之间的区别是什么: Map <String,Integer>myMap = new HashMap<String,Integer>(); Map myMap=newhashmap(); VS HashMap map=newhashmap(); 在这方面,Ron的区别在于: 当您使用Map作为一种类型时,您可以将实现(HashMap)切换到其他类型 这是一件好事 编辑:阅读此-区别在于: 当您使用Map作为一种类型时,您可以将实现(HashMap)

可能重复:

这两者之间的区别是什么:

Map <String,Integer>myMap = new HashMap<String,Integer>();
Map myMap=newhashmap();
VS

HashMap map=newhashmap();
在这方面,Ron的区别在于:

当您使用
Map
作为一种类型时,您可以将实现(HashMap)切换到其他类型

这是一件好事

编辑:阅读此-

区别在于:

当您使用
Map
作为一种类型时,您可以将实现(HashMap)切换到其他类型

这是一件好事


编辑:阅读此-

对象之间没有差异。与对象的接口存在差异。在第一种情况下,接口是
HashMap
,而在第二种情况下,接口是
Map
。不过,底层对象是相同的

使用
Map
的优点是,您可以将底层对象更改为不同类型的Map,而不会破坏与使用它的任何代码的约定。如果将其声明为
HashMap
,则如果要更改基础实现,则必须更改合同


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

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


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

对象之间没有区别。与对象的接口存在差异。在第一种情况下,接口是
HashMap
,而在第二种情况下,接口是
Map
。不过,底层对象是相同的

使用
Map
的优点是,您可以将底层对象更改为不同类型的Map,而不会破坏与使用它的任何代码的约定。如果将其声明为
HashMap
,则如果要更改基础实现,则必须更改合同


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

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

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

另外一点

将变量声明为映射会阻止您使用HashMap类提供的clone()方法

因此,如果您使用:

Map <String,Integer>myMap = new HashMap<String,Integer>();
Map myMap=newhashmap();
那么您不能使用:

Map<String,Integer> myMap2 = myMap.clone();
Map myMap2=myMap.clone();
除此之外,它们还可以互换。

还有一点

将变量声明为映射会阻止您使用HashMap类提供的clone()方法

因此,如果您使用:

Map <String,Integer>myMap = new HashMap<String,Integer>();
Map myMap=newhashmap();
那么您不能使用:

Map<String,Integer> myMap2 = myMap.clone();
Map myMap2=myMap.clone();

除此之外,它们还可以互换。

第一个相关问题。使用搜索第一个相关问题。使用Search非常感谢您的帮助!我不明白为什么人们投票反对这个问题,我认为了解我们使用的数据结构之间的差异非常重要。再次感谢!非常感谢你的帮助!我不明白为什么人们投票反对这个问题,我认为了解我们使用的数据结构之间的差异非常重要。再次感谢!