2011-03-15 48 views
0

有些情況下,您使用列表,無論是數組或鏈接。在其他情況下,您可以使用Map,Java或Dictionary或其他類似的東西。列表與地圖/字典

爲什麼當一個Map給出完全相同的功能,即通過索引訪問(在這種情況下爲整數...)時,您會使用List。

不應該總是首選地圖嗎?我在這裏錯過什麼?

+0

可能重複[列表與地圖在Java](http://stackoverflow.com/questions/3770613/list-vs-map-in-java) – 2011-03-15 14:44:34

回答

3

this question的重複項。

但是要給出一個特定於您的問題的答案,請考慮使用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或打開IDE類文件如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是一個更高效的數據結構。

+0

好吧,我明白了。在這方面你是對的。 – Andr 2011-03-15 14:38:12

1

在我看來,通過索引訪問地圖是一個不尋常的用例。通過密鑰訪問地圖是一種更常見的用例。

在我看來,如果我需要使用明確定義的鍵在結構中查找對象,我將使用Map。如果我通常想要迭代對象集合,我將使用List。

使用一個Map,其中的鍵值實際上是一個索引,好像你對我使用了錯誤的數據結構。

1

Map<Integer, E>List<E>之間的差異是這些,從語義的觀點:

  • 該列表包含0list.size()所有索引,而地圖可以包含任何索引(甚至是負的),用大孔。
  • 向沒有索引的列表添加元素時,會自動獲取新索引。對於地圖來說,沒有這樣的操作。 (不過,您可以很容易地在SortedMaps上實現它。)
  • 當添加帶索引或刪除它們的元素時,在列表中後續索引會移動一位。在地圖上,沒有這種變化(並且添加的元素可能會替換現有的元素)。

這麼說,我曾經創造了一個稀疏列表(含大多null)由HashMap<Integer, E>支持 - 但我禁用結構改變(類似Arrays.asList)。