【问题标题】:Java ArrayList of Map - All Map objects are dupeMap 的 Java ArrayList - 所有 Map 对象都是骗子
【发布时间】:2011-03-25 13:59:12
【问题描述】:

我有一个 Map 对象,每次更新地图时,它的值都会不断变化。它们的键始终相同,但值会发生变化。每次更改 Map 对象时,都会将其添加到 ArrayList。我可以看到,每次将新地图添加到 ArrayList 时,地图中的值都是不同的,但是当 ArrayList 完成更新并准备好从中读取时,其中的所有 Map 都是相同的。

谁能想到为什么会这样?

这基本上就是所有正在发生的事情......UpdateLog 被一个新的 Map 调用了大约 20 次,每个 dataMap1 对象都是不同的。它被添加到 ArrayList。当我调试时,我可以看到 dataMap1 的值每次都不一样。但是完成后,mapLog中的每个dataMap1对象都是一样的!!

public void UpdateLog(final Map<String,String> dataMap1)

{

mapLog.add(dataMap1);    

}

【问题讨论】:

    标签: java map arraylist


    【解决方案1】:

    声明每个 dataMap1 对象都是不同的...但不要忘记 dataMap1 的值只是一个引用,而不是一个对象。如果你这样做:

    Map<String, String> map = new HashMap<String, String>();
    
    map.put("a", "b");
    UpdateLog(map);
    
    map.clear();
    map.put("x", "y");
    UpdateLog(map);
    

    那么实际上并不是使用两个不同的对象。确保你每次都得到一个不同的对象:

    // Replaces the call to map.clear()
    map = new HashMap<String, String>();
    map.put("x", "y");
    UpdateLog(map);
    

    如果这没有帮助,请发布更多代码。不过,鉴于您的描述,这就是正在发生的事情。当然,您可能希望复制您的地图,而不是每次都创建新地图。

    【讨论】:

    • Skeet 将出版一本包含他所有 SO 答案的书并退休。然后我们终于可以得到一些声誉。
    • @Jon Skeet - 问题是,每次更新 dataMap 的线程都会将其清空...while (!stop && serviceCn.isRunning()) { MyService svc = myServiceConn.getService();地图 dataMap = null;数据映射 = svc.getDataMap();更新日志(数据映射)}
    • @Jesse:当您要根据以下语句中对 svc.getDataMap() 的调用来分配变量时,将其设置为 null 毫无意义。我的猜测是svc.getDataMap() 每次都返回对同一张地图的引用。这就是你需要研究的。
    • 对不起,我刚刚加入了 stackoverflow,当我尝试添加评论时,我不知道如何将其指定为代码块,当我按 Enter 时,它只是添加了评论:/
    • @Jesse:只需将其包含在反引号中,因此反引号 x 反引号变为 x
    猜你喜欢
    • 1970-01-01
    • 2021-04-03
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多