【发布时间】:2015-04-30 23:24:53
【问题描述】:
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);
在这个 sn-p 中,我对地图进行了三个查找。有人告诉我这可以通过一次查找来完成,所以我最终在 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。
【问题讨论】:
-
嗯,也许他们的意思只是
get()是一个查找?我看不出有什么办法可以进一步缩短它。 -
你的两个代码没有区别,真的;或者更确切地说,你无法分辨。也许
.containsKey()对于这个Map实现 做了一个完整的检索,也许它没有。在那之后,这只是一个选择问题。但我个人会选择第二种解决方案,即您修改后的代码。 -
@fge 即使我减少了查找次数?如果它对答案有帮助,我正在使用 HashMap。
-
您担心什么需要很长时间?计算哈希码或计算哈希码后找到一个空白点?如果是第一个,那么您可以覆盖 hashcode 函数以缓存其结果。如果是第二个,您可以增加底层数组的大小。你也可以两者都做。
-
@BenjyKessler 调用
get然后put执行两个单独的键查找。对于哈希映射,这是两个 O(1) 操作,但它仍然涉及两次调用hashCode()并可能搜索匹配的存储桶两次。对于树形图,这是两个 O(log n) 操作。 OP 认为这可以改进是正确的。在实践中,这并不重要,但对我来说,这种问题显示出良好的直觉。如果可以避免问题,为什么还要解决它?
标签: java performance dictionary lookup