保护Map的内容免受修改

时间:2013-12-12 22:36:53

标签: java list map

我有一个Map

类型的变量
Map<AiTile, List<AiTile>> result = new HashMap<AiTile, List<AiTile>>();

例如;我在地图内部推了几个AiTile-List然后用方法'clear'擦除List的内容。当我删除列表内容时,我想保护地图内容,我该怎么做?

2 个答案:

答案 0 :(得分:5)

Map.put(key, value)添加对列表的引用,而不是实际的列表内容。如果我理解正确,您希望在地图中保留旧的列表值并删除原始列表的内容。

您可能希望将原始列表的副本添加到地图中,而不是引用。 E.g:

map.put(key, new ArrayList<AiTile>(originalList));

更新

如果您想将关键值对添加到地图中,只有它们尚未存在并更新地图中现有的列表,请使用map.contains(key)list.addAll(anotherList)

// if no key is present
if (!map.containsKey(key)) {
    // add key value pair
    map.put(key, value);
} else {
    // get the current list out of the map
    // and merge it with the new one
    map.get(key).addAll(value);
}

NOTE:根据定义,Lists可以包含重复项。如果要合并两个列表之间的所有项目以使它们不包含重复项,您可能需要查看Sets

>> java doc is your best friend

答案 1 :(得分:1)

  

我想在删除内容时保护地图内容   列表,我该怎么做

然后,您需要为每个列表的HashMap添加单独的内容列表:

   map.put(key, new ArrayList<AiTile>(list));

如果你需要地图不可修改:

Map<AiTile, List<AiTile>>map = Collections.unmodifiableMap(result);

Collections.unmodifiableMap(map):返回指定集合的​​不可修改视图。此方法允许模块为用户提供对内部集合的"read-only"访问权限。对返回的集合"read through"的查询操作到指定的集合,并尝试修改返回的集合,无论是直接还是通过其迭代器,都会产生UnsupportedOperationException