映射和列表值在插入时的模糊性: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]}