我目前对Map何时优于HashMap或其他方式感到困惑,对于list / arraylist来说也是如此......
有人可以请ELI5吗?我知道如何使用它们但我需要有人在应该使用它时为我清理它,谢谢。
答案 0 :(得分:4)
Map
是存储键值对的数据结构,此结构允许您快速查找与给定键对应的对象。示例用例是字典 - 其中,对于给定的单词(键),您可以查找其含义(值)。
List
是另一种存储对象列表的数据结构。与Map
不同,您通常通过迭代数组来访问列表中的对象 - 如果您知道对象所在的列表中的哪个位置,您也可以访问对象。
在 Java 中,Map
和List
是接口 - 它们定义了数据结构应具有的常用方法。可以根据各种需要选择以各种方式实现这些接口。 HashMap
是Map
的一个此类实现,而ArrayList
是List
接口的实现。
要了解Map
和List
的不同实现,您可以分别在Java文档中查看All Known Implementation Classes of Map
和All Known Implementation Classes of List
当您决定使用Map
时,您必须选择用于创建Map
个对象的Map
接口的具体实现 - HashMap
是常用的实现Map
接口(除非有特殊需要,在这种情况下,他们可以选择更合适的实现)。
同样,当您决定使用List
时,您必须选择用于创建List
个对象的List
接口的具体实现 - ArrayList
通常是List
接口的实现(除非有特殊需求,在这种情况下,他们可以选择更多的apt实现)。
在面向对象设计中,还有程序到界面的概念。这表明应该声明它们的变量是由接口表示的类型,而不是具体的实现。
# This is preferred (return interface type)
public Map function() {
return new HashMap();
}
# This should be avoided (do not return implementation type)
public HashMap function() {
return new HashMap();
}
这样做的原因是,如果后来为function
开发代码的人认为Map
返回的function
应该按顺序排列其键(如现实世界中所示)字典),然后她可能决定使用TreeMap
(订购密钥的Map
的实现)而不是HashMap
。
当函数定义为public Map function()
时,function
的所有调用者都将不知道此更改,并且代码中不会有任何更改。但是,当函数定义为public HashMap function()
时,则必须更改为public TreeMap function()
,并强制function
的所有用户更改其代码。
程序到界面允许开发人员将实施选择中的变更影响降至最低。
本着同样的精神,Java有很多接口(Map
,Set
,List
等等),程序员在传递函数对象的引用时应该使用它们调用,而实例化具体对象的代码可以根据程序的需要选择众多实现中的一个。
答案 1 :(得分:0)
它们之间只有一个概念上的区别, Map 是一个接口,或者您也可以将它视为所有类型的地图的父类**(HashMap,TreeMap)**等我们可以将 HashMap 视为可以启动的具体类。列表和数组列表的情况相同List是一个接口, ArrayList 是一个具体的类。
使用Map的优点是,您可以将基础对象更改为不同类型的地图,而不会违反与使用它的任何代码的合同。如果将其声明为HashMap,则必须更改合同,如果要更改基础实现。