Java中HashMap常用方法

原文链接: A Guide to Java HashMap → https://www.baeldung.com/java-hashmap

1. 构造

来源初始化方式空Map可/不可变Map
JDK传统put(k,v)方式new HashMap<>() mutable
JDKCollections.emptyMap() immutable
JDKCollections.EMPTY_MAP immutable
JDKCollections.unmodifiableMap(new HashMap<>() immutable
org.apache.commonsMapUtils.EMPTY_MAP immutable
com.google.commonMaps.newHashMap() mutable
java8新特性双括号初始化{{put(k,v)}} mutable
java9新特性Map.of() immutable
com.google.guavaImmutableMap.of() immutable
com.google.guavaImmutableMap.<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

ref:Java Map的18种遍历方式及性能对比

7. 排序

数组・List・Map・TreeSet排序

在这里插入图片描述

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 使用一个函数来计算值。看业务需要

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值