Javadocs of LinkedHashMap
in JDK8:
调用put或get方法会导致访问相应的条目(假设在调用完成后它存在)。 putAll方法为指定映射中的每个映射生成一个条目访问,按照指定映射的条目集迭代器提供键 - 值映射的顺序。没有其他方法可以生成入口访问。
为什么新的Map方法不会在LinkedHashMap上生成入口访问?特别是getOrDefault()
。这是否违反了最不惊讶的原则?
@PeterLawrey从源代码中可以清楚地看到:
在HashMap
中覆盖 getOrDefault
:
public V getOrDefault(Object key, V defaultValue) {
Node<K,V> e;
return (e = getNode(hash(key), key)) == null ? defaultValue : e.value;
}
LinkedHashMap
扩展HashMap
并仅覆盖get()
:
public V get(Object key) {
Node<K,V> e;
if ((e = getNode(hash(key), key)) == null)
return null;
// generating entry access -- comment by me
if (accessOrder)
afterNodeAccess(e);
return e.value;
}
因此,getOrDefault()
不会生成条目访问。