我不太理解Java中的地图(Maps)。什么情况下建议使用Map而不是List?
假设你有一批学生,他们有姓名和学号。如果你把他们放在一个List中,找到学号为300的学生的唯一方法是逐个查看列表中的每个元素,直到找到正确的学生。
使用Map,你将每个学生的ID和学生实例进行关联。现在你可以说“给我学生300”,然后立即得到该学生的信息。
当你需要从集合中选取特定成员时,请使用Map。如果这没有意义,则使用List。
假设你拥有同样的学生实例,但任务是生成所有学生姓名的报告。这种情况下,你会把它们放在一个List中,因为不需要挑选个别学生,也不需要Map。
Java map(映射): 一种将键映射到值的对象。Map不能包含重复的键;每个键最多只能映射到一个值。
Java list(列表): 有序集合(也称为序列)。该接口的使用者可以精确控制每个元素在列表中的位置。用户可以通过整数索引(在列表中的位置)访问元素,并在列表中搜索元素。
它们之间的区别在于,它们是不同的。Map是键/值对的映射,而list是一组项目的列表。
我认为这主要取决于你想如何访问数据。使用映射表,你可以通过已知的键“直接”访问你的项,在列表中,即使它已经排序,你仍需要搜索。
比较:
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");
如果您有需要处理的数据,并且无论如何都需要进行处理,那么列表就是您所需要的。如果您想要处理具有已知键的单个对象,则使用映射更好。
这并不是完整的答案(只是我的看法...),但我希望它可以帮到您。
当您需要进行映射而非列出时,请注意接口的名称具有意义,不应忽略它。
当您希望数据结构表示键到值的映射时,请使用映射。当您希望数据以任意顺序存储时,请使用列表。
根据您的性能考虑。使用Map,特别是HashMap,可以保证插入和删除的时间复杂度为O(1)。而List查找一个项目的最坏时间复杂度为O(n)。因此,如果您能详细说明您的情况,我们可以提供更多帮助。
映射将数据对象与唯一键存储在一起,因此提供对存储对象的快速访问。您可以使用ConcurrentHashMap来实现多线程环境下的并发。 而列表可能会存储重复的数据,并且您必须迭代数据元素才能访问特定元素,因此提供对存储对象的缓慢访问。 您可以根据需要选择任何数据结构。
Map
和List
有不同的用途。
List
保存项目集合。它是有序的(您可以通过索引获取项目)。
Map
保存映射键->值。例如将人员映射到职位: "JBeg" -> "程序员"。它是无序的。您可以按键获取值,但不能按索引获取。