重置hashmap中的所有值而不进行迭代?

Noo*_*tor 2 java hashmap

HashMap如果条件失败,我正在尝试将a中的所有值重置 为某个默认值.

目前我通过迭代所有键并单独重置值来完成此操作.
有没有可能的方法在没有迭代的情况下为所有键设置相同的值?

就像是:

hm.putAll("some val")  //hm is hashmap object
Run Code Online (Sandbox Code Playgroud)

Ale*_* C. 6

您无法避免迭代,但如果您使用的是,则可以使用replaceAll将为您执行此操作的方法.

将指定的函数应用于此映射中的每个条目,将每个条目的值替换为使用当前条目的键和值调用函数的Function#map方法的结果.

m.replaceAll((k,v) -> yourDefaultValue);
Run Code Online (Sandbox Code Playgroud)

基本上,它遍历映射所保存的表的每个节点,并影响每个值的函数的返回值.

@Override
public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
    Node<K,V>[] tab;
    if (function == null)
        throw new NullPointerException();
    if (size > 0 && (tab = table) != null) {
        int mc = modCount;
        for (int i = 0; i < tab.length; ++i) {
            for (Node<K,V> e = tab[i]; e != null; e = e.next) {
                e.value = function.apply(e.key, e.value); //<-- here
            }
        }
        if (modCount != mc)
            throw new ConcurrentModificationException();
    }
}
Run Code Online (Sandbox Code Playgroud)

例:

public static void main (String[] args){ 
    Map<String, Integer> m = new HashMap<>();
    m.put("1",1);
    m.put("2",2);

    System.out.println(m);
    m.replaceAll((k,v) -> null);
    System.out.println(m);
}
Run Code Online (Sandbox Code Playgroud)

输出:

{1=1, 2=2}
{1=null, 2=null}
Run Code Online (Sandbox Code Playgroud)


Bri*_*new 5

你不能以某种方式避免迭代.

您可以通过Map.values()获取值并迭代这些值.您可以绕过按键查找,它可能是最有效的解决方案(虽然我怀疑通常可以节省相对较少的内容,也许这对您的代码的随意读者来说并不是最明显的)

  • 如果任何解决方案比这更有效,我会感到非常惊讶. (2认同)