gpt4 book ai didi

Java HashMap : A Bug in JVM or I am doing wrong?

转载 作者:行者123 更新时间:2023-11-29 03:14:49 24 4
gpt4 key购买 nike

在下面的代码中:-

  1. 创建 HashMap 并添加一些元素。
  2. 使用第一个的映射创建第二个 HashMap。
  3. 修改第二个HashMap。
  4. 先修改HashMap?

    public static void test(){
    HashMap<Integer, ArrayList<Integer>> testData = new HashMap<Integer, ArrayList<Integer>> ();
    testData.put(1, new ArrayList<Integer>(Arrays.asList(777)));
    System.out.println(testData);
    HashMap<Integer,ArrayList<Integer>> testData1 = new HashMap<Integer, ArrayList<Integer>> (testData);
    testData1.get(1).add(888);
    System.out.println(testData);
    }

输出:

{1=[777]}
{1=[777, 888]}

在这里试试:Code on Ideone.com

我希望 testData 和 testData1 彼此独立,但它们似乎都引用同一个对象?它是用Java编写的吗?我做错了什么吗?

最佳答案

您正在制作原始文件的浅拷贝 HashMap :列表引用被复制,然后是它们的项目。

你需要自己做一个深拷贝:

    HashMap<Integer, List<Integer>> testData = new HashMap<>();
testData.put(1, new ArrayList<>(Arrays.asList(777)));

HashMap<Integer, List<Integer>> testData = new HashMap<>();
testData.put(1, Arrays.asList(777));

HashMap<Integer, List<Integer>> testData2 = new HashMap<>();
for (Map.Entry<Integer, List<Integer>> entry : testData.entrySet()) {
testData2.put(entry.getKey(), new ArrayList<>(entry.getValue()));
}
testData2.get(1).add(888);
System.out.println(testData);
System.out.println(testData2);

这打印:

{1=[777]}
{1=[777, 888]}

作为@jon-kiparsky在评论中很好地解释了:

This may be obvious, but just for completeness: since a HashMap stores objects, not primitives, your maps store references to objects. This is why you need to think in terms of deep and shallow copies.

作为旁注,我还改进了您的示例代码:

  • 在声明中使用接口(interface)类型而不是实现类型
  • 无需换行Arrays.asList(...)new ArrayList<>(...) 里面
  • 使用菱形运算符 <>在 Java 7 中(因此使用 Java 7 或更高版本,因为不再支持旧版本)

关于Java HashMap : A Bug in JVM or I am doing wrong?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27336307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com