HashMap
更新映射条目
处理Map比较麻烦的就是更新映射条目,需要考虑是否已经存在这个条目。来看一个例子,现在使用Map来统计一个单词在文件中出现的频度,取得一个单词的时候,将计数值加一:
wordCount.put(word, wordCount.get(word) + 1);
如果word是第一次出现,get方法将返回null,因此会出现NullPointException异常。可以用getOrDefault方法补救:
wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
另一种方法是先调用putIfAbsent方法,如果键不存在或者键与null关联,就把它与0关联,之后在加一:
wordCount.putIfAbsent(word, 0);
wordCount.put(word, wordCount.get(word) + 1);
还用一种更好的方法,merge可以简化这个常见操作:
wordCount.merge(word, 1, Integer::sum);
如果word第一次出现,这个调用将把word跟1关联,如果不是第一次出现,将调用Integer.sum(a, b)函数,把原来的value和1作为参数传给sum函数,返回值与word关联。
功能演示
package map;
import java.util.*;
/**
* 以String为键,Employee为值,来演示HashMap的使用
*/
public class MapTest
{
public static void main(String[] args)
{
var staff = new HashMap<String, Employee>();
staff.put("144-25-5464", new Employee("Amy Lee"));
staff.put("567-24-2546", new Employee("Harry Hacker"));
staff.put("157-62-7935", new Employee("Gary Cooper"));
staff.put("456-62-5527", new Employee("Francesca Cruz"));
// 打印所有条目
System.out.println(staff);
// 根据键删除一个条目
staff.remove("567-24-2546");
// 用新值替换一个条目
staff.put("456-62-5527", new Employee("Francesca Miller"));
// 打印一个值
System.out.println(staff.get("157-62-7935"));
// 遍历所有
staff.forEach((k, v) -> System.out.println("key=" + k + ", value=" + v));
}
}
package map;
public class Employee
{
private String name;
private double salary;
public Employee(String name)
{
this.name = name;
salary = 0;
}
public String toString()
{
return "[name=" + name + ", salary=" + salary + "]";
}
}