TestForNull的Map Lookup效率

Dum*_*ats 5 java lookup performance dictionary

在SO上引用问题的先前答案,有一个名为TestForNull的方法.在我被告知可以提高效率之前,这是我的原始代码:

我原来的代码:

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);
Run Code Online (Sandbox Code Playgroud)

在这个片段中,我正在对地图进行三次查找.我被告知这可以在一次查找中完成,所以我最终在SO上寻找答案并找到了链接的答案,并将我的代码修改为:

我修改过的代码:

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);
        }
Run Code Online (Sandbox Code Playgroud)

即使它看起来更好,它看起来像两个看起来对我而不是一个.我想知道是否有一个只使用一个的实现,如果它可以在不使用第三方库的情况下完成.如果它有助于我为我的程序使用HashMap.

Joh*_*ica 8

Java 8 defaultMap接口添加了许多可能有用的方法,包括merge:

map.merge(temp[i], 1, v -> v + 1);
Run Code Online (Sandbox Code Playgroud)

而且compute:

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

HashMap这些方法的实现经过适当优化,只能有效地执行单个键查找.(奇怪的是,同样不能说TreeMap.)