java - 更新 TreeMap<String,ArrayList<Integer>> 中的单个键会更改所有键值

标签 java arraylist hashmap

我创建了一个 TreeMap> 并为所有键设置了数组列表值(0,0)。然后我只更新了单个键值。但它最终会更新所有键值。这是我的简化代码

import java.util.*;

public class Test {
    public static void main(String[] args) {
        TreeMap<String, ArrayList<Integer>> treeMap = new TreeMap<>();
        String[] moduleList = {"apple", "orange", "grape"};
        ArrayList<Integer> emptyInitialArrayList = new ArrayList<>(Arrays.asList(0, 0));
        for (String tempModule : moduleList) {
            treeMap.put(tempModule, emptyInitialArrayList);
        }
        ArrayList<Integer> tempModuleMap = treeMap.get("apple");
        tempModuleMap.set(0, tempModuleMap.get(0) + 1);
        for (Map.Entry<String, ArrayList<Integer>> test : treeMap.entrySet()) {
            System.out.println(test.getKey());
            System.out.println(test.getValue().get(0));
            System.out.println(test.getValue().get(1));
        }
    }
}

此代码的输出:

apple
1
0
grape
1
0
orange
1
0

我错过了一些东西。找不到我哪里出错了。

最佳答案

要修复此问题,只需将新的 ArrayList 调用放入循环中即可。否则,您将在所有键之间共享相同的值对象

    String[] moduleList = {"apple", "orange", "grape"};
    for (String tempModule : moduleList) {
        ArrayList<Integer> emptyInitialArrayList = new ArrayList<>(Arrays.asList(0, 0));
        treeMap.put(tempModule, emptyInitialArrayList);
    }

关于java - 更新 TreeMap<String,ArrayList<Integer>> 中的单个键会更改所有键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53193958/

相关文章:

java hashMap<Integer,String> 碰撞

java - m2e 生命周期映射未执行

java - 访问 spring 上下文

C# ArrayList.Add 方法向项目添加引用?

java - Arraylist 或 hashmap 用于添加随机整数,同时保持唯一性

java - 修改 ArrayList<HashMap<String, Integer>> 进行更好的实现

java - 迭代 HashMap 并创建唯一的对象 - 试图防止重复

java - 从 Scala(和 Java)访问 DRb 对象(例如 Ruby 队列)的最佳方式是什么?

java - 我的程序是否可以永久保存变量,而无需在每次程序终止时重置其值?

java - Arraylist 到 JSON 字符串生成器