从地图中获取HashSet并更改后,我是否必须将其放回去?

时间:2012-04-20 11:46:03

标签: java map pass-by-reference

它的工作原理如下:

Set<Integer> nums = numMap.get(id);
nums.add(new Integer(0));
// now do i have to:
numMap.put(id,nums)?
// or is it already stored?

问候&amp;&amp; TIA    noircc

2 个答案:

答案 0 :(得分:5)

除非你对它进行深层克隆,否则你不必把它放回去。一切都基于Java中的引用。

您可以通过编写一个简单的程序来测试它。

public static void main(String... args) {
    Map<Integer, Set<Integer>> numMap = new HashMap<Integer, Set<Integer>>();

    Set<Integer> set = new HashSet<Integer>();
    set.add(10);

    numMap.put(0, set);

    System.out.println("Map before adding is " + numMap);

    set.add(20);

    System.out.println("Map after adding is " + numMap);
}

打印

Map before adding is {0=[10]}
Map after adding is {0=[20, 10]}

答案 1 :(得分:2)

不,你不必重新插入它。

numMap引用存储到值中,Set s引用不会因为您更改Set的内容而发生更改。

如果您在哈希映射中使用Set作为,则 必须重新插入它,因为更改Set的内容,更改设置哈希码。

Map<Set<Integer>, String> map = new HashSet<Set<Integer>, String>();

Set<Integer> nums = ...
map.put(nums, "Hello");    // Use a Set<Integer> as *key*.

nums.add(new Integer(0));  // This changes the keys hashCode (not allowed)

// now do i have to:
numMap.put(nums)?

您需要在更改密钥之前删除映射,并在更改密钥后重新插入映射。