TestForNull的Map Lookup效率

时间:2015-04-30 23:24:54

标签: java performance dictionary lookup

Referencing a previous answer to a question on 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);

在这个片段中,我正在对地图进行三次查找。我被告知这可以在一次查找中完成,所以我最终在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);
        }

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

1 个答案:

答案 0 :(得分:0)

@John Kugelman的答案是最好的(只要你能使用java 8)。

第一个例子有3个地图调用的最坏情况(如果值已存在):

  1. 的containsKey
  2. 获得
  3. 第二个例子总是有2个调用(和空检查):

    1. 获得
    2. 所以你基本上用containsKey进行空检查。

      HashMap中,假设散列码分布良好(并且分布与HashMap的大小一致),这些操作大致是恒定的时间。其他Map实现(例如TreeMap)具有log(n)执行时间。即使在HashMap的情况下,空检查也会比containsKey快,使第二个选项成为赢家。但是,除非您的哈希代码分布不均(或者这是您的应用程序正在执行的唯一操作)或执行效果不佳的等于检查,否则您不太可能产生可测量的差异。