java.util.Map';什么是getOrDefault()工作?

java.util.Map';什么是getOrDefault()工作?,java,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

我注意到,如果我使用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;
    }
}
跟随

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")));

默认对象不应该仅在地图中不存在时创建吗?如果不是,原因是什么?

这不是因为映射的实现方式,而是因为Java的工作方式。运行时解释器必须首先创建对象(newemp
part),然后才能实际调用该方法(getOrDefault
part)

默认对象不应该仅在地图中不存在时创建吗

怎么会是这样?此电话:

map.getOrDefault("1", new Empl("dumnba"))
相当于:

String arg0 = "1";
Empl arg1 = new Empl("dumnba");
map.getOrDefault(arg0, arg1);
换句话说,所有参数在传递给方法之前都要进行求值

您可以改用
computeIfAbsent
,但如果缺少键,则会修改映射,而您可能不需要:

System.out.println(map.computeIfAbsent("1", k -> new Empl("dumnba")));

查看java 8实现:

default V getOrDefault(Object key, V defaultValue) {
    V v;
    return (((v = get(key)) != null) || containsKey(key))
        ? v
        : defaultValue;
}
该文件规定:

返回指定键映射到的值,或 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"));
Map Map=newhashmap();
地图放置(“1”、“Foo”);
//搜索key==1的条目,因为存在,所以返回foo
System.out.println(map.getOrDefault(“1”,“dumnba”);
//搜索key==2的条目,因为不存在,所以返回dumna
System.out.println(map.getOrDefault(“2”,“dumnba”);

函数的所有参数都在函数执行之前进行求值。Java需要评估
newemp(“dumnba”)
,以便将结果传递到
getOrDefault
。在调用
getOrDefault
之前,它无法知道其中一个参数不是必需的

map.computeIfAbsent("1", key -> new Empl("dumnba"))
如果要提供除非需要否则不会计算的默认值,可以使用。为此,您传入一个函数,并且仅当需要默认值时才执行该函数

map.computeIfAbsent("1", key -> new Empl("dumnba"))

自Java 8以来,如果要避免计算默认参数,可以使用Optional的OrelGet方法:

System.out.println(Optional.ofNullable(map.get("1"))
    .orElseGet(() -> new Empl("dumnba")));
如果找到键“1”,OrelGet将返回相应的映射值。否则,它将返回对传递的函数求值的结果。只有在找不到键的情况下,才会对其求值(并实例化类emp)


当然,当找到键时,这将始终实例化可选项。

是否检查了源代码?(我认为在调用之前不执行new是不可能的)您正在将默认对象传递到getOrDefault方法中。您通过编写
new emp(“dumnba”)
来创建它。在第一个代码块的第三行中,第二个复选框-
containsKey(key)
是多余的。不是吗?如果
get(key)!=null
很明显
containsKey(key)
containsKey(key)
返回
null
,当
Map
中没有这样的key,或者
Map
中通过该键有
null
时)