今天是 2017年 農歷新年之后的 上班第一周的 最后一個工作日,好久沒寫博客了,考慮到 過段時間想 換一家公司,是該好好復習一下,正好在回顧一下項目中 遇到的問題。接下來就來說一說 java開發中 常用到的 幾種 集合列表。首先,先看一下這張關系圖:
List、Map、Set都是接口類,它們的 實現類分別是 ArrayList、HashMap、HashSet,當我們新建一個集合列表的時候,也都是 new 的它們各自的具體實現類,而非接口類本身;那么下面我們就對 這三類常用的集合 做一個介紹。
首先是HashMap, 它基于哈希表的 Map 接口的實現。此實現提供所有可選的映射操作,并允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證映射的順序,特別是它不保證該順序恒久不變。就是說,HashMap 保存數據時,采用了鍵值對的 映射關系 來處理數據,但是它處理數據的順序是不確定的。另外,HashMap不是同步的。如果多個線程同時訪問一個哈希映射,而其中至少一個線程從結構上修改了該映射,則它必須 保持外部同步。(結構上的修改是指添加或刪除一個或多個映射關系的任何操作;僅改變與實例已經包含的鍵關聯的值不是結構上的修改。)這一般通過對自然封裝該映射的對象進行同步操作來完成。如果不存在這樣的對象,則應該使用 Collections.synchronizedMap 方法來“包裝”該映射。最好在創建時完成這一操作,以防止對映射進行意外的非同步訪問。還有就是HashMap它沒有實現 Iterable迭代器接口 ,而且保存數據的 時候鍵值不是從下標index=0開始的,無法直接使用增強型for循環;那么如何對Map列表進行遍歷呢?常用方法如下:
Map<String, String> map = new HashMap<String, String>(); map.put("1", "value1"); map.put("2", "value2"); map.put("3", "value3");for (Map.Entry<String, String> entry : map.entrySet()) { System.out.PRintln("key= " + entry.getKey() + " and value= " + entry.getValue()); }其次是ArrayList,它是List 接口的大小可變數組的實現。實現了所有可選列表操作,并允許包括 null 在內的所有元素。除了實現 List 接口外,此類還提供一些方法來操作內部用來存儲列表的數組的大小。假如需要添加大量元素,應用程序可以使用 ensureCapacity 操作來增加 ArrayList 實例的容量。這可以減少遞增式再分配的數量(這個根據實際數據量來操作)。同時,ArrayList它也不是同步的。如果多個線程同時訪問一個 ArrayList 實例,而其中至少一個線程從結構上修改了列表,那么它必須 保持外部同步。(結構上的修改是指任何添加或刪除一個或多個元素的操作,或者顯式調整底層數組的大小;僅僅設置元素的值不是結構上的修改。)這一般通過對自然封裝該列表的對象進行同步操作來完成。如果不存在這樣的對象,則應該使用 Collections.synchronizedList 方法將該列表“包裝”起來。這最好在創建時完成,以防止意外對列表進行不同步的訪問。ArrayList是可以直接使用增強型for循環來遍歷這個列表元素的。再者就是HashSet了,此類實現 Set 接口,由哈希表(實際上是一個 HashMap 實例)支持。它不保證 set 的迭代順序;特別是它不保證該順序恒久不變。此類允許使用 null 元素。HashSet不是同步的。如果多個線程同時訪問一個哈希 set,而其中至少一個線程修改了該 set,那么它必須 保持外部同步。這通常是通過對自然封裝該 set 的對象執行同步操作來完成的。如果不存在這樣的對象,則應該使用 Collections.synchronizedSet 方法來“包裝” set。最好在創建時完成這一操作,以防止對該 set 進行意外的不同步訪問。
LinkedHashMapMap 接口的哈希表和鏈接列表實現,具有可預知的迭代順序。此實現與 HashMap 的不同之處在于,后者維護著一個運行于所有條目的雙重鏈接列表。此鏈接列表定義了迭,
代順序,該迭代順序通常就是將鍵插入到映射中的順序(插入順序)。注意,如果在映射中重新插入 鍵,則插入順序不受影響。(如果在調用 m.put(k, v) 前 m.containsKey(k)
返回了 true,則調用時會將鍵 k 重新插入到映射 m 中。)HashMap和LinkedHashMap區別在于HashMap是無序的,LinkedHashMap是有序的。
新聞熱點
疑難解答