集合-Map
阿新 • • 發佈:2021-11-19
1.常用方法
1、新增操作(與之前的有點不同)
- V put(K key,V value)
- void putAll(Map<? extends K,? extends V> m)
2、刪除
- void clear() 清空所有鍵值對
- V remove(Object key) 移除指定key的鍵值對
3、元素查詢的操作
- V get(Object key)
- boolean containsKey(Object key) 查詢指定key的鍵值對
- boolean containsValue(Object value) 類似上
- boolean isEmpty()
4、元檢視操作的方法:
- Set
keySet() - Collection
values() - Set<Map.Entry<K,V>> entrySet()
5、其他方法
- int size()
2.遍歷
- foreach
- 通過Iterator物件遍歷
- 注意!!!!!!!!!!!(先看這個)
- Map的遍歷,不能支援foreach,因為Map介面沒有繼承java.lang.Iterable
介面,也沒有實現Iterator iterator()方法。 - 分開遍歷:
- 單獨遍歷所有key
- 單獨遍歷所有value
- 成對遍歷:
- 遍歷的是對映關係Map.Entry型別的物件,Map.Entry是Map介面的內部介面。每一種Map內部有自己的Map.Entry的實現類。在Map中儲存資料,實際上是將Key---->value的資料儲存在Map.Entry介面的例項中,再在Map集合中插入Map.Entry的例項化物件,
- 遍歷的是對映關係Map.Entry型別的物件,Map.Entry是Map介面的內部介面。每一種Map內部有自己的Map.Entry的實現類。在Map中儲存資料,實際上是將Key---->value的資料儲存在Map.Entry介面的例項中,再在Map集合中插入Map.Entry的例項化物件,
- Map的遍歷,不能支援foreach,因為Map介面沒有繼承java.lang.Iterable
3.Map實現類
1、HashMap重點
特點
- key
- 無序:
- 不是新增順序
- 唯一
- key不重複
- 無序:
- value
- 只要滿足泛型要求即可
- 注意:
- 如果key 重複 新的value 會替換舊的value
key 儲存自定義型別資料
需要重寫 hashCode equals()
與Hashtable的區別
- HashMap和Hashtable都是雜湊表。
- HashMap和Hashtable判斷兩個 key 相等的標準是:兩個 key 的hashCode 值相等,並且 equals() 方法也返回 true。因此,為了成功地在雜湊表中儲存和獲取物件,用作鍵的物件必須實現 hashCode 方法和 equals 方法。
- Hashtable是執行緒安全的,key和value都不能為null
- HashMap是執行緒不安全的,key和value可以使用 null (可以單獨一個使用)。
從原始碼解釋HashMap
- \1.建立HashMap
- 將預設的負載因子 0.75f 賦值給了成員變數
- \2. 資料新增 第一次新增時 給底層Node[] 16 threshold 12
- 2.1 key null
- 將資料新增到哈西表內下標為0的位置
- 2.2 key 非null
- 2.2.1 插入位置沒有資料
- 直接新增
- 2.2.2 插入位置有資料 key 不一樣
- 原有節點的後面進行追加
- 七上八下 jdk8 下 後面追加
- 2.2.3 插入位置有資料 key相同
- 將新的value 替換 舊的value 並將舊的value返回
- 2.2.4
- 擴容
- 當集合中元素的數量>閾值 觸發擴容 陣列<<1 閾值<<1
- 樹化
- 0.插入位置節點的數量>=8
- \1. 底層陣列長度 >=64
- \3. 插入新的資料 新資料的位置不能為null
- 擴容
- 2.2.1 插入位置沒有資料
- 2.1 key null
2、TreeMap
定義:
基於紅黑樹(Red-Black tree)的 NavigableMap 實現。該對映根據其鍵的自然順序進行排序,或者根據建立對映時提供的 Comparator 進行排序,具體取決於使用的構造方法。
當其key儲存自定義型別資料
需要指定key的比較規則
特點
- key
- 有序:
- 自然順序
- 唯一
- key不重複
- 有序:
- value
- 只要滿足泛型要求即可
- 注意:
- 如果key 重複 新的value 會替換舊的value
3、LinkedHashMap
定義
LinkedHashMap 是 HashMap 的子類。此實現與 HashMap 的不同之處在於,後者維護著一個運行於所有條目的雙重連結列表。此連結列表定義了迭代順序,該迭代順序通常就是將鍵插入到對映中的順序(插入順序)。
特點
- key
- 有序:
- 新增順序
- 唯一
- key不重複
- 有序:
- value
- 只要滿足泛型要求即可
- 注意:
- 如果key 重複 新的value 會替換舊的value
key 儲存自定義型別資料
需要重寫 hashCode equals()
4、Properties
- Properties 類是 Hashtable 的子類,Properties 可儲存在流中或從流中載入。屬性列表中每個鍵及其對應值都是一個字串。
- 存取資料時,建議使用setProperty(String key,String value)方法和getProperty(String key)方法。
4.拓展
- HashSet 底層採用的是 HashMap將儲存的值放到了 Map key 的位置
- LinkedHashSet 底層採用的是 LinkedHashMap將儲存的值放到了 Map key 的位置
- TreeSet 底層採用的是 TreeMap將儲存的值放到了 Map key 的位置