如何用布尔值有效地替换Java HashMap

use*_*928 6 java initialization hashmap

我很感兴趣如何快速将布尔值更改为此hashmap:

HashMap<String, Boolean> selectedIds = new HashMap<>(); 
Run Code Online (Sandbox Code Playgroud)

我想非常快地将布尔值全部替换为true.我怎么能这样做?

Boh*_*ian 11

最快的方法是这样的:

for (Map.Entry<String, Boolean> entry : selectedIds.entrySet()) {
    entry.setValue(true);
}
Run Code Online (Sandbox Code Playgroud)

此代码可以避免任何查找,因为它会迭代整个映射的条目并直接设置它们的值.

请注意,无论何时HashMap.put()调用,都会在内部发生键查找Hashtable.虽然代码是高度优化的,但仍需要计算和比较哈希码的工作,然后使用算法最终找到条目(如果存在).这都是"工作",并消耗CPU周期.


Java 8更新:

Java 8 replaceAll()为此目的引入了一种新方法,使得所需的代码更简单:

selectedIds.replaceAll((k, v) -> true);
Run Code Online (Sandbox Code Playgroud)

  • 为什么抓住整个条目的速度要快于关键?setValue的开销是否较少? (3认同)
  • @DavidB因为`setValue()`没有键查找.你的解决方案必须查找每个键,因为它使用`put()`n次!这个解决方案什么都没有查找 - 它直接设置每个条目的值.我鼓励你学习这种迭代地图的方式 - 它应该总是优先使用查找来迭代密钥集 - 使用`get()`或`put()`查找密钥,这需要哈希代码比较和算法(这是快速确定的,但它仍然有效) (3认同)

Dav*_*d B 5

这将迭代您的地图并将每个键的所有旧值替换为true值.HashMap put方法

for(String s : selectedIds.keySet()) {
    selectedIds.put(s, true);
 }
Run Code Online (Sandbox Code Playgroud)

  • 你不需要`selectedIds.keySet()`吗?或者是自动的? (2认同)