src/share/classes/java/util/LinkedHashMap.java

Print this page
rev 8969 : 8029795: LinkedHashMap.getOrDefault() doesn't update access order.
Reviewed-by: psandoz

*** 26,36 **** package java.util; import java.util.function.Consumer; import java.util.function.BiConsumer; import java.util.function.BiFunction; - import java.io.Serializable; import java.io.IOException; /** * <p>Hash table and linked list implementation of the <tt>Map</tt> interface, * with predictable iteration order. This implementation differs from --- 26,35 ----
*** 61,78 **** * * <p>A special {@link #LinkedHashMap(int,float,boolean) constructor} is * provided to create a linked hash map whose order of iteration is the order * in which its entries were last accessed, from least-recently accessed to * most-recently (<i>access-order</i>). This kind of map is well-suited to ! * building LRU caches. Invoking the <tt>put</tt> or <tt>get</tt> method ! * results in an access to the corresponding entry (assuming it exists after ! * the invocation completes). The <tt>putAll</tt> method generates one entry ! * access for each mapping in the specified map, in the order that key-value ! * mappings are provided by the specified map's entry set iterator. <i>No ! * other methods generate entry accesses.</i> In particular, operations on ! * collection-views do <i>not</i> affect the order of iteration of the backing ! * map. * * <p>The {@link #removeEldestEntry(Map.Entry)} method may be overridden to * impose a policy for removing stale mappings automatically when new mappings * are added to the map. * --- 60,80 ---- * * <p>A special {@link #LinkedHashMap(int,float,boolean) constructor} is * provided to create a linked hash map whose order of iteration is the order * in which its entries were last accessed, from least-recently accessed to * most-recently (<i>access-order</i>). This kind of map is well-suited to ! * building LRU caches. Invoking the {@code put}, {@code putIfAbsent}, ! * {@code get}, {@code getOrDefault}, {@code compute}, {@code computeIfAbsent}, ! * {@code computeIfPresent}, or {@code merge} methods results ! * in an access to the corresponding entry (assuming it exists after the ! * invocation completes). The {@code replace} method only results in an access ! * of the entry if the value is replaced. The {@code putAll} method generates one ! * entry access for each mapping in the specified map, in the order that ! * key-value mappings are provided by the specified map's entry set iterator. ! * <i>No other methods generate entry accesses.</i> In particular, operations ! * on collection-views do <i>not</i> affect the order of iteration of the ! * backing map. * * <p>The {@link #removeEldestEntry(Map.Entry)} method may be overridden to * impose a policy for removing stale mappings automatically when new mappings * are added to the map. *
*** 110,121 **** * A structural modification is any operation that adds or deletes one or more * mappings or, in the case of access-ordered linked hash maps, affects * iteration order. In insertion-ordered linked hash maps, merely changing * the value associated with a key that is already contained in the map is not * a structural modification. <strong>In access-ordered linked hash maps, ! * merely querying the map with <tt>get</tt> is a structural ! * modification.</strong>) * * <p>The iterators returned by the <tt>iterator</tt> method of the collections * returned by all of this class's collection view methods are * <em>fail-fast</em>: if the map is structurally modified at any time after * the iterator is created, in any way except through the iterator's own --- 112,123 ---- * A structural modification is any operation that adds or deletes one or more * mappings or, in the case of access-ordered linked hash maps, affects * iteration order. In insertion-ordered linked hash maps, merely changing * the value associated with a key that is already contained in the map is not * a structural modification. <strong>In access-ordered linked hash maps, ! * merely querying the map with <tt>get</tt> is a structural modification. ! * </strong>) * * <p>The iterators returned by the <tt>iterator</tt> method of the collections * returned by all of this class's collection view methods are * <em>fail-fast</em>: if the map is structurally modified at any time after * the iterator is created, in any way except through the iterator's own
*** 441,452 **** afterNodeAccess(e); return e.value; } /** ! * Removes all of the mappings from this map. ! * The map will be empty after this call returns. */ public void clear() { super.clear(); head = tail = null; } --- 443,465 ---- afterNodeAccess(e); return e.value; } /** ! * {@inheritDoc} ! */ ! public V getOrDefault(Object key, V defaultValue) { ! Node<K,V> e; ! if ((e = getNode(hash(key), key)) == null) ! return defaultValue; ! if (accessOrder) ! afterNodeAccess(e); ! return e.value; ! } ! ! /** ! * {@inheritDoc} */ public void clear() { super.clear(); head = tail = null; }