映射和列表值在插入时的模糊性:java

映射和列表值在插入时的模糊性:java,java,list,hashmap,Java,List,Hashmap,我正在地图中使用列表插入,无法理解插入行为 public class TestList { public static void main(String[] args) { String strarray[] = new String[5]; for(int i = 0; i < 5; i++ ){ strarray[i] = "Demo" + i; } Map<Integer, List<String>>

我正在地图中使用列表插入,无法理解插入行为

public class TestList {

public static void main(String[] args) {

    String strarray[] = new String[5];

    for(int i = 0; i < 5; i++ ){

        strarray[i] = "Demo" + i;
    }

    Map<Integer, List<String>> cluesByText = new HashMap<Integer, List<String>>();
    int j = 0;
    for (String str : strarray) {

        System.out.println(str);
        List<String> s = cluesByText.get(str);
        if (s == null) {
            s = new LinkedList<String>();
            cluesByText.put(j, s);
        }

        s.add(str);
        s.add(str);
        s.add(str);
        s.remove(1);
        // why it is storing without doing cluesByText.put(j,s);
        j++;
    }

    //output is:

    System.out.println(cluesByText);

}
}

我不明白为什么会发生这种情况,因为列表的状态已经存储在map中了?

您有一个对
列表的引用,因此可以添加到列表中。如果地图没有条目,则创建新的
列表
,并将条目添加到地图中。无论如何,
列表
的范围使其可用。

您有一个对
列表
的引用,因此可以添加到列表中。如果地图没有条目,则创建新的
列表
,并将条目添加到地图中。无论如何,
列表的范围使其可用于工作。

这是预期的行为-您正在地图中存储对列表的引用,而不是副本。同一列表在
s
中引用,因此如果您通过
s
添加到列表中,确实可以从地图中看到它-它只是对同一对象的两个引用。

这是预期行为-您在地图中存储对列表的引用,而不是副本。同一个列表在
s
中引用,因此如果您通过
s
添加到列表中,确实可以从地图中看到它-它只是对同一对象的两个引用。

请记住,Java中的(几乎)一切都是引用,而不是值。所以,你得到的是一个从整数到列表“地址”的映射,而不是列表的“状态”

当你去学习存储在列表中的信息时,计算机会去那个地址查看那里有什么

当将
s
分配给该列表时,它将获取该地址并将其存储在
s

当您通过
s.add()
s.remove()
对该列表进行更改时,它会转到该地址(与映射中的地址相同),并在该地址进行更改

所以,当你最终通过地图返回到那个地址时,你看到的是相同的值

唯一没有发生这种情况的情况是,当您使用
=
操作符分配
s
时:那么您实际上是在用另一个操作符过度写入地址,因此查看原始地址的内容不会受到影响。

请记住(几乎)Java中的所有内容都是引用,而不是值。所以,你得到的是一个从整数到列表“地址”的映射,而不是列表的“状态”

当你去学习存储在列表中的信息时,计算机会去那个地址查看那里有什么

当将
s
分配给该列表时,它将获取该地址并将其存储在
s

当您通过
s.add()
s.remove()
对该列表进行更改时,它会转到该地址(与映射中的地址相同),并在该地址进行更改

所以,当你最终通过地图返回到那个地址时,你看到的是相同的值


唯一没有发生这种情况的情况是,当您使用
=
运算符分配
s
时:那么您实际上是在用另一个运算符过度写入地址,因此,查看原始地址的内容不会受到影响。

您插入的列表的值仍然指向原始列表的值。与您的问题无关,但您的代码没有多大意义
cluesByText.get(str)
将始终返回null,因为映射的键是整数,而不是字符串。插入的列表的值仍然指向原始列表的值。与您的问题无关,但您的代码没有多大意义
cluesByText.get(str)
将始终返回null,因为映射的键是整数,而不是字符串。
{0=[Demo0, Demo0], 1=[Demo1, Demo1], 2=[Demo2, Demo2], 3=[Demo3, Demo3], 4=[Demo4, Demo4]}