为什么我得错了名单?

时间:2015-01-12 14:39:57

标签: java list hashmap system.out

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

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

从长远来看,你应该看一下关于传递引用和传值的区别的一般CS或java教程。

答案 2 :(得分:2)

当您将元素添加到List

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

您正在添加对象的引用。

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

你能做什么?

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

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