本文主要對jdk 8 Map 新提供的相關Api 做簡單的代碼演示
前篇:JDK8的 Map 基本描敘
-
new hashMap():new的時候底層沒有創建一個長度爲16的數組 ,首次使用put()方法時底層創建長度爲16的Node[]數組
-
JDK 8中底層的數組是Node[]類型的數組而非Entry[]類型
-
JDK8中的底層結構爲數組+鏈表+紅黑樹;JDK7底層結構只有數組+鏈表,
-
當數組中的某一個索引位置上的元素以鏈表形式存在的數據個數大於8且當前數組長度超過64時,此索引位置上的所有數據改爲使用紅黑樹存儲。
-
DEFAULT_INITIAL_CAPACITY:HashMap的默認容量,16
-
DEFAULT_LOAD_FACTOR:HashMap默認加載因子,0.75
-
threshold:擴容的臨界值,容量 * 加載因子 = 12
-
resize : 每次擴容大小爲原大小的 2 倍
-
TREETFY_THRESHOLD:Bucket中鏈表長於該默認值,轉化爲紅黑樹:8
-
MIN_TREETFY_CAPACITY:桶中Node被樹化時最小的hash表容量:64
1、getOrDefault(當vlalue 爲空設置默認值)
獲取key對應的value,當key不存在時,返回默認值
Map<String, Object> map = new HashMap<>();
Object value = map.getOrDefault("key", "Default");
System.out.println("value: " + value);
// 輸出 value=Default
2、forEach( 更簡單的for 循環)
Map<String, Object> map2 = new HashMap<>();
map2.put("a", 1);
map2.forEach((k, v) -> {
System.out.println(k + "=" + v);
});
// 輸出 a=1
// 或 map2.forEach((k, v) -> System.out.println(k + "=" + v)); 具體請自行了解 Lambda 簡寫規則
3、replaceAll(按照指定的邏輯替換所有value)
Map<String, Object> map3 = new HashMap<>();
map3.put("a", 1);
map3.put("b", 2);
map3.put("c", 3);
map3.replaceAll((k, v) -> v = 100);
map3.forEach((k, v) -> System.out.println(k + "=" + v));
// 輸出
// a=100
// b=100
// c=100
4、putIfAbsent(當key不存在時添加, key不做任何操作)
Map<String, Integer> map4 = new HashMap<>();
map4.put("a", 1);
map4.putIfAbsent("a", 10);
map4.putIfAbsent("b", 10);
map4.forEach((k, v) -> System.out.println(k + " -> " + v));
// 輸出
// a -> 1
// b -> 10
5、remove(刪除,當key,value 完全相同才刪除)
Map<String, Integer> map5 = new HashMap<>();
map5.put("A", 1);
map5.put("B", 2);
map5.remove("A", 1);
map5.remove("B", 1);
map5.forEach((k, v) -> System.out.println(k + " -> " + v));
// 輸出 B -> 2
6、 replace(對存在的key 執行 value 替換)
// 當key相等時替換
Map<String, Integer> map6 = new HashMap<>();
map6.put("A", 1);
map6.replace("A", 10);
map6.forEach((k, v) -> System.out.println(k + " -> " + v)); // 輸出: A -> 10
// 當key+ value 都相等時替換
map6.replace("A", 10, 100);
map6.forEach((k, v) -> System.out.println(k + " -> " + v)); // 輸出: A -> 100
7、computeIfAbsent(對不存在的key進行計算)
Map<Character, Integer> map7 = new HashMap<>();
map7.put('A', 65);
map7.put('B', 66);
map7.put('C', null);
map7.computeIfAbsent('B', (key) -> 1000); //對存在的key無效
map7.computeIfAbsent('C', (key) -> (int) key); //獲取key的對應的 Ascii值
map7.computeIfAbsent('D', (key) -> 100); //value=100
map7.computeIfAbsent('F', (key) -> 100 * 2); //value=100*2
map7.forEach((k, v) -> System.out.println(k + " -> " + v));
// 輸出
// A -> 65
// B -> 66
// C -> 67
// D -> 100
// F -> 200
8、computeIfPresent(對存在的key進行計算)
Map<Character, Integer> map8 = new HashMap<>();
map8.put('A', 1);
map8.put('B', 2);
map8.put('C', null);
map8.computeIfPresent('A', (key, oldValue) -> oldValue + 10); // 1+10 :正常計算
map8.computeIfPresent('B', (key, oldValue) -> null); // null:將從map中移除
map8.computeIfPresent('C', (key, oldValue) -> oldValue + 10); // null+100:value=null
map8.forEach((k, v) -> System.out.println(k + " -> " + v));
// 輸出
// A -> 11
// C -> null
9、compute(對指定key進行計算)
Map<Character, Integer> map9 = new HashMap<>();
map9.put('A', 1);
map9.put('B', 2);
//map9.compute('A', (key, oldValue) -> oldValue + 100); // 1+100(注意: 當oldValue=null,會拋出 NullPointerException的空指針異常)
map9.compute('A', (key, oldValue) -> oldValue == null ? 100 : oldValue + 100); // 1+100
map9.compute('B', (key, oldValue) -> null); // 爲null時從map刪除
map9.compute('C', (key, oldValue) -> 100); // 不存在key時在map中添加
map9.forEach((k, v) -> System.out.println(k + " -> " + v));
// 輸出
// A -> 101
// C -> 100
10、merge(合併value的新值和舊值)
Map<String, Object> map10 = new HashMap<>();
map10.put("A", 10);
map10.put("B", "10");
map10.merge("A", 1, (oldValue, newValue) -> Integer.parseInt(oldValue + "") + Integer.parseInt((newValue + ""))); // 數字運算: 10+1 其他說明: map的value類型爲Integer可簡寫爲: map10.merge('A', 1, Integer::sum);
map10.merge("B", 2, (oldValue, newValue) -> oldValue.toString() + newValue); // 字符串運算: 10+2
map10.merge("C", 3, (oldValue, newValue) -> newValue); // map不存在key時在map中添加
map10.forEach((k, v) -> System.out.println(k + " -> " + v));
// 輸出結果
// A -> 11
// B -> 102
// C -> 3