原文链接: A Guide to Java HashMap → https://www.baeldung.com/java-hashmap
目录
1. 构造
来源 | 初始化方式 | 空Map | 可/不可变Map |
---|---|---|---|
JDK | 传统put(k,v) 方式 | new HashMap<>() | mutable |
JDK | Collections.emptyMap() | immutable | |
JDK | Collections.EMPTY_MAP | immutable | |
JDK | Collections.unmodifiableMap(new HashMap<>() | immutable | |
org.apache.commons | MapUtils.EMPTY_MAP | immutable | |
com.google.common | Maps.newHashMap() | mutable | |
java8新特性 | 双括号初始化{{put(k,v)}} | mutable | |
java9新特性 | Map.of() | immutable | |
com.google.guava | ImmutableMap.of() | immutable | |
com.google.guava | ImmutableMap.<String, String>builder().put(k,v).build() | immutable |
上表参考
Java初始化
map的5种方式
Java创建空
map的5种方法
Java创建不可变
map的4种方法
key相同时,Map是新值覆盖
原来的值,而set是拒绝存入。
2. 增:put
HashMap<String, Integer> map = new HashMap<>();
// {}
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Cherry", 3);
// {Apple=1, Cherry=3, Banana=2}
3. 删:remove・clear・removeIf
map.remove("Banana");
// {Apple=1, Cherry=3}
map.clear();
// {}
# java8 removeIf删除元素
map.entrySet().removeIf(entry -> entry.getKey() != 1); 删除符合条件的Entry
map.keySet().removeIf(key -> key != 1); 删除符合条件的Entry
map.values().removeIf(value -> value.contains("1")); 删除符合条件的Entry
ref:Java如何删除map中的元素
4. 改:put
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Banana", 3);
// {Apple=1, Banana=3}
[Q&A] 平时都使用Map的put方法,但是put方法返回值是啥?
Map<Object, Boolean> map = new HashMap<>();
Boolean value1 = map.put("key", true);
System.out.println(value1); // null key上个值为null,故返回null
Boolean value2 = map.put("key", false);
System.out.println(value2); // true key上个值为true,故返回true
5. 查:isEmpty・size・containsKey・containsValue・get
Integer age6 = map.get("name"); // Integer时返回null可以
int age6 = map.get("name"); // int时返回null报错
Integer age5 = map.getOrDefault("name", 0); // 取不到使用默认值
int mapSize = map.size();
boolean hasOrange = map.containsKey("Orange");
boolean hasOrange = map.containsValue("Orange");
# MapUtils
Map<String, Integer> map = new HashMap<>();
Integer age1 = MapUtils.getInteger(map, "name"); // Integer时返回null可以
int age3 = MapUtils.getInteger(map, "name"); // int时返回null报错
Integer age1 = MapUtils.getInteger(map, "name", 0); // 取不到返回null
int age3 = MapUtils.getInteger(map, "name", 0); // 取不到返回null
dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
<scope>compile</scope>
/dependency>
6. 遍历:entrySet・keySet・values
7. 排序
8. 判等
9. Java8流式用法
10. 数据结构间切换
计算:computeIfPresent・computeIfAbsent・putIfAbsent
computeIfPresent-是否线程安全取决于使用的Map实现
Map<String, Integer> scores = new HashMap<>();
scores.put("Alice", 85);
scores.put("Bob", 95);
System.out.println(scores);
scores.computeIfPresent("Alice", (key, oldValue) -> {
if (oldValue >= 85) {
return oldValue + 5;
}
return oldValue;
});
System.out.println(scores);
// {Bob=95, Alice=85}
// {Bob=95, Alice=90}
computeIfAbsent-是否线程安全取决于使用的Map实现
如果键 key 不存在于 Map 中,则使用
mappingFunction
计算新的值,并将键值对(key, computedValue)
插入到Map
中。
如果键 key 已存在于 Map 中,则返回该键对应的现有值。
HashMap<String, Integer> prices = new HashMap<>();
prices.put("Shoes", 200);
prices.put("Bag", 300);
prices.put("Pant", 150);
System.out.println("HashMap: " + prices);
int shirtPrice = prices.computeIfAbsent("Shirt", key -> 280);
System.out.println("Updated HashMap: " + prices);
// HashMap: {Pant=150, Bag=300, Shoes=200}
// Updated HashMap: {Pant=150, Shirt=280, Bag=300, Shoes=200}
putIfAbsent---------是否线程安全取决于使用的Map实现
如果键 key 不存在于 Map 中,则将键值对
(key, value)
插入到Map
中,并返回null
。
如果键 key 已存在于 Map 中,则返回该键对应的现有值。
Map<Object, Boolean> map = new HashMap<>();
System.out.println(map); // {}
Boolean value1 = map.putIfAbsent("key", true);
System.out.println(value1); // map不存在key,故返回null
System.out.println(map); // {key1=true}
Boolean value2 = map.putIfAbsent("key", false);
System.out.println(value2); // map存在key,故返回存的true
System.out.println(map); // {key1=true}
[Q&A] putIfAbsent 存在的问题
当key对应的值为null
时,调用putIfAbsent
返回null
无法判断是存在键(key,null)
,还是key
不存在。
[Q&A] putIfAbsent 和 computeIfAbsent 使用区别
putIfAbsent
使用提供的固定值,而computeIfAbsent
使用一个函数来计算值。看业务需要