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;
}