Java Collections HashMap,值意外变化

标签 java

public class ListMap {
    HashMap<Integer, List> mp = new HashMap();
    List myList = new ArrayList();
    Integer x = 0;
    Integer y = 5;

    void test() {
    for(Integer i = 0; i < 5; i++) {
        x = y;
        myList.add("check-1a" + i);
        myList.add("check-1a" + i + 1);
        y = null;
        System.out.println(x); // output=5
        mp.put(i, myList);
        myList.clear();
    }
}

1) 但是在使用 myList.clear() 清除列表后,Map 内的值也会被清除。

我的意思是说 map key保留在那里,但它包含一个“空”列表

2)但是对于对象xy,将y设置为null之后怎么会x 没有改变?

最佳答案

当您将对象添加到 map (或任何其他集合)时,您将添加对该对象的引用,而不是副本。当您随后对对象进行更改时,这些更改也将影响 map 中的引用。

当您想要存储列表的副本时,您需要创建一个新的副本。这可以这样完成:

mp.put(i, new ArrayList(myList));

另一种(在我看来甚至更好)解决方案是在每次循环迭代开始时通过将其设置为新的列表对象来重新初始化 myList:

myList = new ArrayList();
myList.add("check-1a"+i);
myList.add("check-1a"+i+1);
mp.put(i,myList);

请注意,当您重新初始化变量 myList 时,列表不会被销毁。您可以想象生活在 map 内部的物体*。

*虽然技术上更准确的描述是“该对象存在于内存中,并且只要映射中仍然存储对其的引用,就不会被垃圾收集”

关于Java Collections HashMap,值意外变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28095434/

相关文章:

java - 在jsp页面中动态添加按钮和文本框

java - ClassNotFoundException com.mysql.jdbc.Driver

java - 如何使用java删除hbase列族

java - 使用 java ogm 保留 Neo4j 的空间(点)属性

java - IntelliJ无法在Scala中识别TypeTag

java - 在 doxygen 输出中隐藏公共(public)包

java - 运行 Pigunit 样本测试时出现奇怪的错误

java - getXmlEncoding() 给出了错误的输出

java - Spring-jpa-数据 : more than one DataSource and one single Spring config

java - 返回 Try 的方法是否允许抛出异常?