看看这个小例子
import java.util.ArrayList;
import java.util.HashMap;
public class Foo {
public static void main(String[] args) {
ArrayList<Integer> array = new ArrayList<Integer>();
HashMap<String, ArrayList<Integer>> foo = new HashMap<String,ArrayList<Integer>>();
for (int i = 0; i < 20; i++)
array.add(i);
foo.put("1", array);
// array.clear();
System.out.println(foo.get("1").size());
}
}
现在,如果使用array.clear()
,它会自动删除与hashmap中指定键关联的arrayList的所有值
如何防止这种情况?
以这样的方式:
我可以执行array.clear();
(在hashmap中输入值后),只删除ArrayList<Integer> array
与该键相关联的数组的值不会被删除在hashmap内
如果您启动此计划,它将打印 20 而不使用array.clear();
, 0 而不是
答案 0 :(得分:2)
它正在删除maps键元素,因为它们都是相同的对象。你必须做一个浅表副本才能使两个列表分开
创建浅拷贝非常简单:
List<Integer> newList = new ArrayList<Integer>(oldList);
以下是代码:
public class Foo {
public static void main(String[] args) {
ArrayList<Integer> array = new ArrayList<Integer>();
HashMap<String, ArrayList<Integer>> foo = new HashMap<String, ArrayList<Integer>>();
for (int i = 0; i < 20; i++)
array.add(i);
ArrayList<Integer> newList = new ArrayList<Integer>(array);
foo.put("1", newList);
array.clear();
System.out.println(foo.get("1").size());
}
}
答案 1 :(得分:2)
foo.get("1")
和array
指的是同一个对象。您需要foo.put("1", new ArrayList<Integer>(array));
。
答案 2 :(得分:1)
不要放入ArrayList本身,而是将其复制:
foo.put("1", new ArrayList<Integer>(array));
如果你想放置数组本身,你必须让它不可修改:
Map<String, List<Integer>> foo = ...;
...
List<Integer> unmodifiableArray = Collections.unmodifiableList(array);
foo.put(unmodifiableArray);
答案 3 :(得分:1)
问题在于你没有写&#34; new&#34;对象进入该地图。换一种说法 您的列表名为&#34; array&#34;,它与地图中的列表完全相同的内存地址,因此......如果您更改1,则更改会在两个位置显示。