本文主要对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