【发布时间】:2011-04-15 19:08:54
【问题描述】:
我没有理解 Java 中的地图。什么时候推荐使用 Map 而不是 List?
【问题讨论】:
标签: java list dictionary
我没有理解 Java 中的地图。什么时候推荐使用 Map 而不是 List?
【问题讨论】:
标签: java list dictionary
假设您有一群学生,他们有姓名和学生证。如果将它们放在一个列表中,找到 student_id = 300 的学生的唯一方法是查看列表中的每个元素,一次一个,直到找到合适的学生。
使用地图,您可以将每个学生的 ID 与学生实例相关联。现在你可以说,“让我学生 300”并立即让那个学生回来。
当您需要从集合中挑选特定成员时,请使用地图。在没有意义的情况下使用列表。
假设您有完全相同的学生实例,但您的任务是生成所有学生姓名的报告。您可以将它们放在列表中,因为不需要挑选个别学生,因此不需要地图。
【讨论】:
Java map:将键映射到值的对象。地图不能包含重复的键;每个键最多可以映射到一个值。
Java 列表:有序集合(也称为序列)。此界面的用户可以精确控制每个元素在列表中的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并在列表中搜索元素。
不同之处在于它们是不同的。 Map 是键/值的映射,是项目列表的列表。
【讨论】:
映射用作键和值的关联。使用列表,您基本上只有值。
List 中的索引始终是 int,而 Map 中可以有另一个 Object 作为键。
资源:
【讨论】:
取决于您的性能问题。 Map 更明确地 HashMap 将保证 O(1) 的插入和删除。 List 最坏的情况是 O(n) 才能找到一个项目。因此,如果您能详细说明您的方案是什么,我们可能会提供更多帮助。
【讨论】:
修改Random Access 与Sequential Access Data Structures 可能是个好主意。它们都具有不同的运行时复杂性,并且适用于不同类型的上下文。
【讨论】:
我认为您希望如何访问数据的问题很多。使用地图,您可以使用已知键“直接”访问您的项目,在列表中您必须搜索它,如果它已排序。
比较:
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");
如果您有数据要处理并且无论如何都需要处理所有对象,那么您需要一个列表。如果您想处理具有已知键的单个对象,则映射更好。 它不是完整的答案(只是我的 2 ......),但我希望它可以帮助你。
【讨论】:
当您想要映射而不是列表时。这些接口的名称是有意义的,你不应该忽略它。
当您希望数据结构表示键到值的映射时,请使用映射。如果您希望数据以任意、有序的格式存储,请使用列表。
【讨论】:
Map 和 List 有不同的用途。
List 保存项目集合。已订购(您可以按索引获取项目)。
Map 持有映射键 -> 值。例如。将人员映射到位置:“JBeg”->“程序员”。它是无序的。您可以通过键获取值,但不能通过索引。
【讨论】:
地图存储具有唯一键的数据对象,因此可以快速访问存储的对象。您可以使用 ConcurrentHashMap 在多线程环境中实现并发。 而列表可能存储重复数据,您必须遍历数据元素才能访问特定元素,因此对存储对象的访问速度较慢。 您可以根据需要选择任何数据结构。
【讨论】: