HashMap

更新映射条目

处理Map比较麻烦的就是更新映射条目,需要考虑是否已经存在这个条目。来看一个例子,现在使用Map来统计一个单词在文件中出现的频度,取得一个单词的时候,将计数值加一:

  1. wordCount.put(word, wordCount.get(word) + 1);

如果word是第一次出现,get方法将返回null,因此会出现NullPointException异常。可以用getOrDefault方法补救:

  1. wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);

另一种方法是先调用putIfAbsent方法,如果键不存在或者键与null关联,就把它与0关联,之后在加一:

  1. wordCount.putIfAbsent(word, 0);
  2. wordCount.put(word, wordCount.get(word) + 1);

还用一种更好的方法,merge可以简化这个常见操作:

  1. wordCount.merge(word, 1, Integer::sum);

如果word第一次出现,这个调用将把word跟1关联,如果不是第一次出现,将调用Integer.sum(a, b)函数,把原来的value和1作为参数传给sum函数,返回值与word关联。

功能演示

  1. package map;
  2. import java.util.*;
  3. /**
  4. * 以String为键,Employee为值,来演示HashMap的使用
  5. */
  6. public class MapTest
  7. {
  8. public static void main(String[] args)
  9. {
  10. var staff = new HashMap<String, Employee>();
  11. staff.put("144-25-5464", new Employee("Amy Lee"));
  12. staff.put("567-24-2546", new Employee("Harry Hacker"));
  13. staff.put("157-62-7935", new Employee("Gary Cooper"));
  14. staff.put("456-62-5527", new Employee("Francesca Cruz"));
  15. // 打印所有条目
  16. System.out.println(staff);
  17. // 根据键删除一个条目
  18. staff.remove("567-24-2546");
  19. // 用新值替换一个条目
  20. staff.put("456-62-5527", new Employee("Francesca Miller"));
  21. // 打印一个值
  22. System.out.println(staff.get("157-62-7935"));
  23. // 遍历所有
  24. staff.forEach((k, v) -> System.out.println("key=" + k + ", value=" + v));
  25. }
  26. }
  1. package map;
  2. public class Employee
  3. {
  4. private String name;
  5. private double salary;
  6. public Employee(String name)
  7. {
  8. this.name = name;
  9. salary = 0;
  10. }
  11. public String toString()
  12. {
  13. return "[name=" + name + ", salary=" + salary + "]";
  14. }
  15. }