为什么我得到错误的列表?

Why am I getting the wrong List?

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

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

来自 sysos? 当它实际上应该是

> {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;
    }

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

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

当您将元素添加到 List:

时会发生什么
l.add(rm);

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

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

你能做什么?

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

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

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

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

从长远来看,您应该查看一些通用的 CS 或 java 教程,了解按引用传递和按值传递之间的区别。