java.util.Map的getOrDefault()如何工作?

Man*_*har 17 java

我注意到,如果我执行map.getOrDefault("key1",new Object()),即使key1在地图中存在对象,new Object()也会创建.虽然它不是由方法返回但它仍然创建它.例如,

public class Empl {
    private int id;
    private String name;

    public Empl(String name) {
        // TODO Auto-generated constructor stub
        System.out.println(name);
        this.name = name;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return name+id;
    }
}
Run Code Online (Sandbox Code Playgroud)

运行以下,

Map<String, Empl> map = new HashMap<String, Empl>();
Empl imp = new Empl("timon");
map.put("1", imp);
System.out.println(map.getOrDefault("1", new Empl("dumnba")));
Run Code Online (Sandbox Code Playgroud)

给出这个输出:

timon
dumnba
timon0
Run Code Online (Sandbox Code Playgroud)

仅当地图中没有默认对象时,才应该创建默认对象吗?如果没有,是什么原因?

Jon*_*eet 21

仅当地图中没有默认对象时,才应该创建默认对象吗?

那怎么可能呢?这个电话:

map.getOrDefault("1", new Empl("dumnba"))
Run Code Online (Sandbox Code Playgroud)

相当于:

String arg0 = "1";
Empl arg1 = new Empl("dumnba");
map.getOrDefault(arg0, arg1);
Run Code Online (Sandbox Code Playgroud)

换句话说,所有参数传递给方法之前都会被计算.

您可能会使用computeIfAbsent,但如果密钥不存在,则会修改地图,您可能不需要:

System.out.println(map.computeIfAbsent("1", k -> new Empl("dumnba")));
Run Code Online (Sandbox Code Playgroud)


ΦXo*_*a ツ 6

查看 java 8 实现:

default V getOrDefault(Object key, V defaultValue) {
    V v;
    return (((v = get(key)) != null) || containsKey(key))
        ? v
        : defaultValue;
}
Run Code Online (Sandbox Code Playgroud)

该文档指定:

返回指定键映射到的值,如果此映射不包含键的映射,则返回 defaultValue。奥特

它将返回地图中不存在的默认值

例子:

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

    map.put("1", "Foo");
    //search for the entry with key==1, since present, returns foo
    System.out.println(map.getOrDefault("1", "dumnba"));
    //search for the entry with key==2, since not present, returns dumnba
    System.out.println(map.getOrDefault("2", "dumnba"));
Run Code Online (Sandbox Code Playgroud)


khe*_*ood 6

在执行函数之前,将评估函数的所有参数.Java需要进行评估,new Empl("dumnba")以便将结果传递给getOrDefault.之前无法知道的getOrDefault是,其中一个参数不会被要求.

如果要提供除非需要而未计算的默认值,您可以使用computeIfAbsent.为此,您传入一个函数,只有在需要默认值时才会执行该函数.

map.computeIfAbsent("1", key -> new Empl("dumnba"))
Run Code Online (Sandbox Code Playgroud)