哈希映射和arrayList

时间:2014-05-05 13:20:04

标签: java arraylist hashmap

看看这个小例子

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 而不是

4 个答案:

答案 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,则更改会在两个位置显示。