作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的代码中:-
先修改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.
作为旁注,我还改进了您的示例代码:
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/
我是一名优秀的程序员,十分优秀!