Map或HashMap,List还是ArrayList?

时间:2015-08-09 12:47:43

标签: java list dictionary arraylist hashmap

我目前对Map何时优于HashMap或其他方式感到困惑,对于list / arraylist来说也是如此......

有人可以请ELI5吗?我知道如何使用它们但我需要有人在应该使用它时为我清理它,谢谢。

2 个答案:

答案 0 :(得分:4)

Map是存储键值对的数据结构,此结构允许您快速查找与给定键对应的对象。示例用例是字典 - 其中,对于给定的单词(键),您可以查找其含义(值)。

List是另一种存储对象列表的数据结构。与Map不同,您通常通过迭代数组来访问列表中的对象 - 如果您知道对象所在的列表中的哪个位置,您也可以访问对象。

Java 中,MapList接口 - 它们定义了数据结构应具有的常用方法。可以根据各种需要选择以各种方式实现这些接口。 HashMapMap的一个此类实现,而ArrayListList接口的实现。

要了解MapList的不同实现,您可以分别在Java文档中查看All Known Implementation Classes of MapAll 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有很多接口(MapSetList等等),程序员在传递函数对象的引用时应该使用它们调用,而实例化具体对象的代码可以根据程序的需要选择众多实现中的一个。

答案 1 :(得分:0)

它们之间只有一个概念上的区别, Map 是一个接口,或者您也可以将它视为所有类型的地图的父类**(HashMap,TreeMap)**等我们可以将 HashMap 视为可以启动的具体类。列表和数组列表的情况相同List是一个接口, ArrayList 是一个具体的类。

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