首頁 > 軟體

詳解Java集合類之Map篇

2022-07-26 18:00:37

1.Map介面介紹

Map用於儲存具有對映關係的資料:Key - Value

對於Set,底層其實依然是一個Map,但是Set選擇不使用Value,也就是Set的Value值始終是一個常數

Map中的Key和Value可以是任何型別的資料,會封裝到HashMap$Node物件中

Map中的Key不能重複,但是Value可以重複,當有相同的Key時,等價與替換操作

2.Map介面分析

存放Map鍵值對是在HashMap$Node中

tab[i] = newNode(hash, key, value, null);

--

Node<K,V> newNode(int hash, K key, V value, Node<K,V> next) {
    return new Node<>(hash, key, value, next);
}

那麼這個Node節點的資料型別是什麼樣的呢?

我們來看一下原始碼:(其還實現了Entry介面)

static class Node<K,V> implements Map.Entry<K,V> {
    final int hash;  // 存放hash值
    final K key;  // 存放key值
    V value;  // 存放Value值
    Node<K,V> next;  // 存放下一個個節點,以形成連結串列結構
}

k-v為了方便程式設計師的遍歷,還會建立一個EntrySet集合,該集合存放的元素型別是Entry,而一個Entry物件含有k,v,但是本質上這裡的k-v值還是指向一個Node節點中的資料,也就是這裡的k-v存放的依然是地址資料

// k-v存在有EntrySet的一個指向
Set set = map.entrySet();
System.out.println(set.getClass());

輸出:

class java.util.HashMap$EntrySet

那麼,這個方便程式設計師遍歷的特性是如何體現的呢?

原因是Map.Entry提供了兩個非常重要的方法:K getKey(); V getValue();。所以我們可以通過如下的方式進行遍歷Map:

Set set = map.entrySet();
System.out.println(set.getClass());
for (Object obj : set) {
    Map.Entry entry = (Map.Entry) obj;
    System.out.println(entry.getKey());
    System.out.println(entry.getValue());
}

那怎麼證明Entry裡面存放的k-v只是地址的指向呢?很簡單

通過debug,我們先來看一下Map中存放的資料,其no2這個鍵的地址是@727

再來看一下set中no2鍵的地址,一模一樣:

3.Map介面方法

程式碼範例:

Map map = new HashMap();
// 新增鍵值對
map.put("no1","dahe");
map.put("no2","zhangsan");
// Key重複會進行替換
map.put("no1","lisi");
System.out.println(map);

// 根據鍵刪除對映關係
map.remove("no1");
System.out.println(map);
// 根據key得到值
Object no2 = map.get("no2");
System.out.println(no2);
// 獲取鍵值對數量
System.out.println(map.size());
// 判空
System.out.println(map.isEmpty());
// 清空
// map.clear();
// 查詢鍵是否存在
System.out.println(map.containsKey("ok"));

4.Map遍歷方式

第一式:取出所有的key,通過key取出對應的value

// 取出所有的key,通過key取出對應的value
Set keySet = map.keySet();
for (Object o : keySet) {
    System.out.println(o);
    System.out.println(map.get(o));
}

第二式:把所有的value值取出

// 把所有的value值取出
Collection values = map.values();
for (Object value : values) {
    System.out.println(value);
}

第三式:通過EntrySet來獲取 k-v

// 通過EntrySet來獲取 k-v
Set entrySet1 = map.entrySet();
for (Object o : entrySet1) {
    // 將entry 轉成 Map.Entry
    Map.Entry m = (Map.Entry) o;
    System.out.println(m.getKey());
    System.out.println(m.getValue());
}

到此這篇關於詳解Java集合類之Map篇的文章就介紹到這了,更多相關Java集合類Map內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com