国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

HashMap、ArrayList、Set、LinkedHashMap的使用及區別

2019-11-09 14:03:32
字體:
來源:轉載
供稿:網友

今天是 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是有序的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安平县| 察雅县| 阜城县| 临沂市| 疏附县| 松原市| 保靖县| 正定县| 桂林市| 来安县| 隆昌县| 温泉县| 景谷| 托克托县| 汤阴县| 石台县| 古蔺县| 延川县| 扶绥县| 平顶山市| 长春市| 阜康市| 塔河县| 恩平市| 吴堡县| 西吉县| 长乐市| 嵊泗县| 固始县| 日照市| 南雄市| 固镇县| 专栏| 海安县| 肇源县| 太原市| 建阳市| 崇左市| 汝南县| 临武县| 瑞金市|