Map用來保存具有映射關係的資料:Key - Value
#對於Set,底層其實還是一個Map,但Set選擇不使用Value,也就是Set的Value值總是一個常數
Map中的Key和Value可以是任何類型的數據,會封裝到HashMap$Node物件中
Map中的Key不能重複,但是Value可以重複,當有相同的Key時,等價與替換操作
#存放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鍵的位址,一模一樣:
程式碼範例:
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"));
第一式:取出所有的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怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!