【问题标题】:Why am I getting the wrong List?为什么我得到错误的列表?
【发布时间】:2015-03-10 08:47:56
【问题描述】:

我得到了一些奇怪的结果,无法解释。 你有什么想法吗,为什么我会得到 ​​p>

> {Level=1 - Normal, Name=IT/Java} 
> {Level=2 - Medium, Name=IT/Ruby}
> [{Level=2 - Medium, Name=IT/Ruby}, {Level=2 - Medium, Name=IT/Ruby}]

来自系统系统? 实际上应该是什么时候

> {Level=1 - Normal, Name=IT/Java} 
> {Level=2 - Medium, Name=IT/Ruby}
> [{Level=1 - Normal, Name=IT/Java}, {Level=2 - Medium, Name=IT/Ruby}]

这是我的代码。

public List<Map<String, Object>> getMapsforTables() {
        levelList = this.getSkilllevel();
        description = this.getSkillnames();
        Map<String, Object> rm = new HashMap<String, Object>();
        List<Map<String, Object>> l = new LinkedList<Map<String, Object>>();

        for(int i=0; i < levelList.size(); i++){
            rm.clear();
            rm.put("Name", description.get(i));
            rm.put("Level", levelList.get(i));
            System.out.println(rm);
            l.add(rm);
        }
        System.out.println(l);
        return l;
    }

【问题讨论】:

  • 请了解什么是对象和引用 - 您不断更改一个对象,同时已经将其放置在另一个对象中,并想知道之后会发生什么变化。

标签: java list hashmap system.out


【解决方案1】:

简短版本是因为您一遍又一遍地重复使用相同的 Map 对象。

Map&lt;String, Object&gt; rm = new HashMap&lt;String, Object&gt;(); 行移到for 循环内,作为第一条语句,您的问题应该会消失。

从长远来看,你应该看看一些通用的 CS 或 java 教程,了解 pass-by-reference 和 pass-by-value 之间的区别。

【讨论】:

    【解决方案2】:

    当你将元素添加到List时会发生什么:

    l.add(rm);
    

    您正在添加对对象的引用。

    在下一次迭代中,您正在修改rm 引用的对象,然后再次添加它。因此,您两次添加了相同的引用。

    你能做什么?

    一个简单的解决方案是在循环内声明rm

    for(int i=0; i < levelList.size(); i++){
        Map<String, Object> rm = new HashMap<String, Object>();
        ...
    }
    

    【讨论】:

      【解决方案3】:

      因为在每次迭代中,您都在修改同一个对象并将其添加到列表中。你可以这样做:

      for(int i = 0; i < levelList.size(); i++){
          Map<String, Object> rm = new HashMap<String, Object>();
          rm.put("Name", description.get(i));
          rm.put("Level", levelList.get(i));
          System.out.println(rm);
          l.add(rm);
      }
      

      【讨论】: