在Java中何时使用Map而不是List?

31

我不太理解Java中的地图(Maps)。什么情况下建议使用Map而不是List?

9个回答

56

假设你有一批学生,他们有姓名和学号。如果你把他们放在一个List中,找到学号为300的学生的唯一方法是逐个查看列表中的每个元素,直到找到正确的学生。

使用Map,你将每个学生的ID和学生实例进行关联。现在你可以说“给我学生300”,然后立即得到该学生的信息。

当你需要从集合中选取特定成员时,请使用Map。如果这没有意义,则使用List。

假设你拥有同样的学生实例,但任务是生成所有学生姓名的报告。这种情况下,你会把它们放在一个List中,因为不需要挑选个别学生,也不需要Map。


6
将英语翻译成中文。仅返回已翻译的文本:+1,如果不引用javadoc并提供说明性示例 :) - andr
1
如果学生ID映射到一个索引,例如ID 300 -> 299 [索引],那么这是一个常数时间查找,但从技术上讲并不正确。 - Woot4Moo
我并没有说它是错误的,但是你所做的更广泛的陈述(从理论角度)是不太正确的。 - Woot4Moo
@Woot4Moo 如果学生ID是字符串而不是数字,怎么办? - user2520215
谁说学生ID必须方便地映射到数组中?如果有一个ID是9位数字,怎么办? - Tony Ennis
显示剩余2条评论

29

Java map(映射): 一种将键映射到值的对象。Map不能包含重复的键;每个键最多只能映射到一个值。

Java list(列表): 有序集合(也称为序列)。该接口的使用者可以精确控制每个元素在列表中的位置。用户可以通过整数索引(在列表中的位置)访问元素,并在列表中搜索元素。

它们之间的区别在于,它们是不同的。Map是键/值对的映射,而list是一组项目的列表。


11
你忘记了列表可以包含重复项。 - Woot4Moo
2
一个列表是有序的吗?还是“有序”和“排序”意思不同?我并不是在挑剔…… - Tony Ennis
Java文档说是有序的,我差点和Tony写了一样的东西。 - Woot4Moo
4
@Tony:Sorted(已排序)!= Ordered(有序)。对于有序集合,元素具有某种顺序(程序员很明显,通常可以由程序员操纵)。列表是有序的,例如LinkedList中的每个项目都指向下一个项目。对于已排序的集合,项的顺序是通过比较项来确定的,并始终保持排序状态。 - user395760
一个使用案例比仅有定义更好。我感觉原帖的作者知道定义,但无法想象实际应用场景。 - Kumar Manish

4

我认为这主要取决于你想如何访问数据。使用映射表,你可以通过已知的键“直接”访问你的项,在列表中,即使它已经排序,你仍需要搜索。

比较:

List<MyObject> list = new ArrayList<MyObject>();
//Fill up the list
// Want to get object "peter"
for( MyObject m : list ) {
 if( "peter".equals( m.getName() ) {
    // found it
 }
}

在地图上,您只需输入
Map<String, MyObject> map = new HashMap<String, MyObject>();
// Fill map
MyObject getIt = map.get("peter");

如果您有需要处理的数据,并且无论如何都需要进行处理,那么列表就是您所需要的。如果您想要处理具有已知键的单个对象,则使用映射更好。

这并不是完整的答案(只是我的看法...),但我希望它可以帮到您。


3

地图被用作关键字和值之间的关联。列表基本上只有值。

List 中的索引始终为 int,而在 Map 中,您可以将另一个对象作为键。


资源 :


3

当您需要进行映射而非列出时,请注意接口的名称具有意义,不应忽略它。

当您希望数据结构表示键到值的映射时,请使用映射。当您希望数据以任意顺序存储时,请使用列表。


这就像在定义中使用一个单词一样。这并不是一个非常有帮助的答案... - Chris Thompson
3
不,这是在指出那些接口的名称具有含义,你不应该忽视它。 - Sheldon L. Cooper
1
添加了您的评论和更多信息,然后取消了我的反对票。 - Erick Robertson

3

根据您的性能考虑。使用Map,特别是HashMap,可以保证插入和删除的时间复杂度为O(1)。而List查找一个项目的最坏时间复杂度为O(n)。因此,如果您能详细说明您的情况,我们可以提供更多帮助。


3

0

映射将数据对象与唯一键存储在一起,因此提供对存储对象的快速访问。您可以使用ConcurrentHashMap来实现多线程环境下的并发。 而列表可能会存储重复的数据,并且您必须迭代数据元素才能访问特定元素,因此提供对存储对象的缓慢访问。 您可以根据需要选择任何数据结构。


0

MapList有不同的用途。

List保存项目集合。它是有序的(您可以通过索引获取项目)。

Map保存映射键->值。例如将人员映射到职位: "JBeg" -> "程序员"。它是无序的。您可以按键获取值,但不能按索引获取。


Treemap实现的Map不是无序的。 - jrowe08
排序后不等于有序。 - trilogy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接