Re: optimsed HashMap
On 11/27/2012 5:01 AM, Arved Sandstrom wrote:
On 11/26/2012 09:28 PM, Eric Sosman wrote:
On 11/26/2012 6:44 PM, Daniel Pitts wrote:
I don't think your use-case needs this kind of (read "micro")
optimization. However, I have often wished for a way to get a Map.Entry
for a key, which could then be used to insert a new value efficiently.
Map.Entry<K,V> getOrAddEntry(K key);
Map.Entry<K,V> e = map.getOrAddEntry(myKey);
if (e.getValue() == null) {
e.setValue(newValue(myKey));
}
useValue(e.getValue());
Alas, not exactly possible to add it now.
java.util.concurrent.ConcurrentMap has putIfAbsent().
It's almost certainly a reflection (no pun intended) of what I do with
Maps, but a common variant use case for me is
putEmptyListAndAddValueToListIfAbsent
I don't normally use ConcurrentHashMap so the usual idiom for me is a
contains() check that may put() the new empty list as a value,
afterwards the list (empty or otherwise) is always got, and the actual
value added to it.
I usually write it as
List<V> list = map.get(key);
if (list == null) {
list = new SomeKindOfList();
map.put(key, list);
}
list.add(newValue);
.... which involves one extra lookup per mapped key, not one
extra lookup per query.
The imaginary getOrAddEntry() would be nice, although it
might complicate the Map.Entry interface itself (you'd want a
way to distinguish "This key maps to null" from "This key is
newly entered").
--
Eric Sosman
esosman@comcast-dot-net.invalid