1. 程式人生 > 其它 >集合-Map

集合-Map

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的例項化物件,

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、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 的位置
作者:Ya 出處:https://www.cnblogs.com/1463490Ya/ 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連線,否則保留追究法律責任的權利。