Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Map Lookup Efficiency of TestForNull

Referencing a previous answer to a question on SO, there is a method used called TestForNull. This was my original code before I was told I could make it more efficient:

My original code:

for (int i = 0; i < temp.length; i++) {
            if (map.containsKey(temp[i]))
                map.put(temp[i], map.get(temp[i]) + 1);
            else
                map.put(temp[i], 1);

In this snippet, I'm doing three look-ups to the map. I was told that this could be accomplished in just one lookup, so I ended up looking for an answer on SO and found the linked answer, and modified my code to look like:

My modified code:

for (int i = 0; i < temp.length; i++) {
            Integer value = map.get(temp[i]); 
            if (value != null)
                map.put(temp[i], value + 1);
            else
                map.put(temp[i], 1);
        }

Even though it seems better, it looks like two look-ups to me and not one. I was wondering if there was an implementation of this that only uses one, and if it can be done without the use of third-party libraries. If it helps I'm using a HashMap for my program.

like image 840
Dumpcats Avatar asked Apr 30 '15 23:04

Dumpcats


1 Answers

Java 8 has added a number of default methods to the Map interface that could help, including merge:

map.merge(temp[i], 1, v -> v + 1);

And compute:

map.compute(temp[i], (k, v) -> v == null ? 1 : v + 1);

HashMap's implementations of these methods are appropriately optimized to effectively only perform a single key lookup. (Curiously, the same cannot be said for TreeMap.)

like image 133
John Kugelman Avatar answered Sep 19 '22 05:09

John Kugelman