java - HashMap 和数组列表

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

最佳答案

它正在删除 map 键元素,因为它们是相同的对象。您必须进行浅拷贝才能使两个列表分开

虽然创建浅拷贝非常简单:

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());
    }

}

关于java - HashMap 和数组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23473567/

相关文章:

Java - 添加一个对象而不引用原始对象

java - hashmap 中键集和值的顺序是否相同

java - 为什么这个圆圈没有被涂抹

java - 在@Scheduled中分配字符串(cron ="Some String")

java - Intellij IDEA Ultimate android 布局预览无法等待构建完成

java - 如何对 ArrayList<CustomObject> 中的元素进行分组

java - 性能关键的 ArrayList 迭代(ioshed 示例)

java - 使用双键创建 HashMap

java - 为 Shopify 应用程序生成访问 token 时出错

Java ArrayList 按元素属性过滤