0

在下面的代码中,我创建了一个接受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
4

3 回答 3

3

地图存储对列表的引用。它不关心引用指向的对象,如果它是可变的,它可能会改变它的状态。put如果您想更改地图状态本身,则调用是必要的- 更改与键关联的引用,例如将完全不同的新List的与键关联。

于 2013-09-06T08:32:48.130 回答
1

这不是新的LinkedList

LinkedList<String> newList = map.get(1);
newList.add(2,"Khayal");
newList.remove(3);

它返回您正在修改LinkedList的现有对象。Map所以一切都按预期工作。

于 2013-09-06T08:33:45.550 回答
1

您只是引用相同的列表,而不是在下面创建新列表。

LinkedList<String> newList = map.get(1);

这就是为什么即使你正在修改newListlist也会被修改。

尝试如下更改,

LinkedList<String> newList = new LinkedList<String>(map.get(1));
于 2013-09-06T08:35:52.263 回答