Java –如何在HashMap中更新键的值

阅读 1325 收藏 0 点赞 0 评论 0

本文介绍了几种更新或增加HashMap中的键的值的方法。

目录

1.更新HashMap中的键值

如果键不存在,则该put方法将创建具有关联值的键;如果键存在,则put更新其值。

  Map<String, Integer> map = new HashMap<>();
  map.put("a", 1);
  System.out.println(map.get("a"));   // 1

  map.put("a", 2);                    // 键“ a”存在,更新或替换值
  System.out.println(map.get("a"));   // 2个

输出

1
2

2.在HashMap中增加键的值

2.1我们可以使用以下get() + 1方法更新或增加键的值。

  Map<String, Integer> map = new HashMap<>();
  // 如果键不存在,则抛出NullPointerException
  map.put("count", map.get("count") + 1);

输出

Exception in thread "main" java.lang.NullPointerException:
  Cannot invoke "java.lang.Integer.intValue()"
  because the return value of "java.util.Map.get(Object)" is null

2.2但是,如果键不存在,则上述方法将引发NullPointerException。固定的是使用containsKey()来确保键在更新键的值之前存在。

  Map<String, Integer> map = new HashMap<>();

  for (int i = 0; i < 10; i++) {
      if (map.containsKey("count")) {
          map.put("count", map.get("count") + 1);
      } else {
          map.put("count", 1);
      }
  }

  System.out.println(map.get("count"));

输出

10

或像以下方法一样使用一根衬管。

  map.put("count", map.containsKey("count") ? map.get("count") + 1 : 1);

3. Java 8 getOrDefault()

在Java 8中,我们可以用getOrDefault来为不存在的键提供默认值。

  Map<String, Integer> map = new HashMap<>();
  for (int i = 0; i < 10; i++) {
      // if key "count" doesn't exist, default to 0
      map.put("count", map.getOrDefault("count", 0) + 1);
  }
  System.out.println(map.get("count"));

输出

10

4. Java 8计算和合并

Java 8还添加了compute()和merge()增强了Map接口。以下示例增加了HashMap中的键值。


4.1 Java 8合并示例

对于merge(),第一个参数是Map的键,第二个参数是默认值,第三个参数是BiFunction接受两个参数并提供键输出的a。

  Map<String, Integer> map = new HashMap<>();
  for (int i = 0; i < 10; i++) {
      // 如果键不存在,则默认为1
      map.merge("count", 1, (v1, v2) -> v1 + v2);
  }
  System.out.println(map.get("count"));

输出

10

我们可以使用方法参考简化lambda。

  Map<String, Integer> map = new HashMap<>();
  for (int i = 0; i < 10; i++) {
      map.merge("count", 1, Integer::sum);
  }
  System.out.println(map.get("count"));

4.2 Java 8计算

这compute类似于merge;第一个参数是Map的键,第二个参数是BiFunction。

  Map<String, Integer> map = new HashMap<>();
  for (int i = 0; i < 10; i++) {
      map.compute("count", (k, v) -> (v == null) ? 1 : v + 1);
  }
  System.out.println(map.get("count"));

输出

10

另一个Java 8compute示例,它增加了键的值。

TestMap.java

package com.mkyong.basic;

import java.util.HashMap;
import java.util.Map;

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i < 10; i++) {
        
            //map.compute("count", (k, v) -> createDefault(k, v));

            // 方法引用
            map.compute("count", TestMap::createDefault);
        }
        System.out.println(map.get("count"));

    }

    private static Integer createDefault(String key, Integer value) {

        if (value == null) {
            return 1;
        }

        return value + 1;
    }

}

输出

10

5. Java 8 computeIfPresent

computeIfPresent是类似于compute但运行计算方法仅当键存在或存在。

5.1以下computeIfPresent示例将打印一个null。

  Map<String, Integer> map = new HashMap<>();
  for (int i = 0; i < 10; i++) {
      // 键数不存在,请跳过x 10
      map.computeIfPresent("count", (k,v) -> v + 1);
  }
  System.out.println(map.get("count"));

输出

null

5.2以下computeIfPresent示例将打印一个10。

  Map<String, Integer> map = new HashMap<>();
  map.put("count", 0);
  for (int i = 0; i < 10; i++) {
      // 键存在,好的,运行这个
      map.computeIfPresent("count", (k, v) -> v + 1);
  }
  System.out.println(map.get("count"));

输出

10

6. Java 8 computeIfAbsent和putIfAbsent

6.1computeIfAbsent与computeIfPresent相似,但是仅在不存在或不存在键的情况下才运行compute方法。

TestMap.java

package com.mkyong.basic;

import java.util.HashMap;
import java.util.Map;

public class TestMap {

  public static void main(String[] args) {

      Map<String, Integer> map = new HashMap<>();
      for (int i = 0; i < 10; i++) {
          // 如果键不存在,则仅运行一次,否则跳过此步骤。
          map.computeIfAbsent("count", TestMap::createDefault);
      }
      System.out.println(map.get("count"));

  }

  private static Integer createDefault(String key) {
      System.out.println("正在创建默认值...。");
      if ("count".equalsIgnoreCase(key)) {
          return 0;
      } else {
          return -1;
      }
  }

}

输出

正在创建默认值...。
0

6.2以下示例用于computeIfAbsent提供键的默认值;computeIfPresent更新或增加键值。

  Map<String, Integer> map = new HashMap<>();
  for (int i = 0; i < 10; i++) {
      map.computeIfAbsent("count", TestMap::createDefault);   // 默认0
      map.computeIfPresent("count", (k, v) -> v + 1);         // 增加+1
  }
  System.out.println(map.get("count"));

输出

正在创建默认值...。
10

6.3还有一个putIfAbsent仅当键不存在时才更新值。

  Map<String, Integer> map = new HashMap<>();
  for (int i = 0; i < 10; i++) {
      //map.computeIfAbsent("count", TestMap::createDefault);
      map.putIfAbsent("count", 0);
      map.computeIfPresent("count", (k, v) -> v + 1);
  }
  System.out.println(map.get("count"));

区别在于 computeIfAbsent 使用一个函数更新值,putIfAbsent 直接更新值。

评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号