有些情况下您使用List,无论是数组还是链接。在其他情况下,您可以使用Map,java或Dictionary或其他类似的东西。
当Map提供完全相同的功能时,为什么要使用List,即索引访问(在本例中为整数...)。
地图总是不应该首选?我在这里想念什么?
答案 0 :(得分:3)
但是要给出一个特定于你的问题的答案,请考虑使用Map结构来维护由整数索引的集合的效率。
考虑以下代码:
public void add(Map map, Object o) {
int index = map.size();
map.put(index, o);
}
public static void add(List list, Object o) {
list.add(o);
}
现在看看编译器将其转换为什么(使用javap或在Eclipse中打开类文件,如Eclipse):
public void add(java.util.Map map, java.lang.Object o);
0 aload_1 [map]
1 invokeinterface java.util.Map.size() : int [16] [nargs: 1]
6 istore_3 [index]
7 aload_1 [map]
8 iload_3 [index]
9 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [22]
12 aload_2 [o]
13 invokeinterface java.util.Map.put(java.lang.Object, java.lang.Object) : java.lang.Object [28] [nargs: 3]
18 pop
19 return
Line numbers:
[pc: 0, line: 8]
[pc: 7, line: 9]
[pc: 19, line: 10]
Local variable table:
[pc: 0, pc: 20] local: this index: 0 type: MapListTest
[pc: 0, pc: 20] local: map index: 1 type: java.util.Map
[pc: 0, pc: 20] local: o index: 2 type: java.lang.Object
[pc: 7, pc: 20] local: index index: 3 type: int
// Method descriptor #38 (Ljava/util/List;Ljava/lang/Object;)V
// Stack: 2, Locals: 2
public static void add(java.util.List list, java.lang.Object o);
0 aload_0 [list]
1 aload_1 [o]
2 invokeinterface java.util.List.add(java.lang.Object) : boolean [39] [nargs: 2]
7 pop
8 return
Line numbers:
[pc: 0, line: 13]
[pc: 8, line: 14]
Local variable table:
[pc: 0, pc: 9] local: list index: 0 type: java.util.List
[pc: 0, pc: 9] local: o index: 1 type: java.lang.Object
将集合维护为List而不是Map,所做的工作要少得多。因此,List是一种更有效的数据结构。
答案 1 :(得分:1)
在我看来,通过索引访问地图是一个不寻常的用例。通过密钥访问Map是一个更常见的用例。
在我看来,如果我需要使用定义良好的键在结构中查找对象,我将使用Map。如果我通常想要迭代对象集合,我将使用List。
使用一个映射,其中键值实际上是一个索引,好像你使用了错误的数据结构给我。
答案 2 :(得分:1)
从语义角度来看,Map<Integer, E>
和List<E>
之间存在差异:
0
到list.size()
的所有索引,而地图可以包含任何具有大洞的索引(甚至是负数)。也就是说,我曾经创建了一个由null
支持的稀疏列表(主要包含HashMap<Integer, E>
) - 但是我禁用了结构修改(类似于Arrays.asList)