在以下代码中,我创建了一个接受LinkedList
作为其值的地图。使用特定键我得到LinkedList
,修改它并打印值以检查它是否被修改。
当值打印出来时,我看到它被修改了。但我不希望LinkedList中的值发生变化,直到我这样做,
map.put(for_the_same_key,modified_list) // so that old key gets replaced by this
为什么修改新LinkedList
时地图中的LinkedList
会发生变化。
import java.util.*;
class MapTester {
public static void main(String args[]) {
Map<Integer,LinkedList<String>> map = new HashMap<Integer,LinkedList<String>>();
LinkedList<String> list = new LinkedList<String>();
list.add("Suhail");
list.add("Gupta");
list.add("CSE");
map.put(1,list);
LinkedList<String> newList = map.get(1);
newList.add(2,"Khayal");
newList.remove(3);
LinkedList<String> newListAg = map.get(1);
for(String s : newListAg) {
System.out.println(s);
}
}
}
输出:
Suhail
Gupta
Khayal // I EXPECTED 'CSE' HERE
答案 0 :(得分:3)
地图存储对列表的引用。它并不关心引用指向的对象,如果它是可变的,它可能会改变它的状态。如果您想要更改地图状态本身,则需要调用put
- 更改与该关键字相关联的引用,例如将完全不同的新List
与密钥相关联。
答案 1 :(得分:1)
这不是新的LinkedList
:
LinkedList<String> newList = map.get(1);
newList.add(2,"Khayal");
newList.remove(3);
它返回您正在修改的LinkedList
中的现有Map
。所以一切都按预期工作。
答案 2 :(得分:1)
您只是引用相同的列表,不在下面创建新列表。
LinkedList<String> newList = map.get(1);
这就是为什么即使您修改newList
,list
也会被修改。
尝试按以下方式更改
LinkedList<String> newList = new LinkedList<String>(map.get(1));