说明:
我的一个问题集随测试用例一起提供,以检查键入的代码是否正常工作。我不会详细介绍,但是基本上这些测试都将地图作为输入。我的代码适用于除以下情况以外的所有测试用例:当我看一下测试时,我发现输入映射被更改为不可修改的映射( Collections.unmodifiableMap(numbers)),并且不可修改的映射传递给我编写的方法。这是唯一的测试,因此我想知道是否可以复制此不可修改的地图,以便可以在我的方法中对其进行修改?
我必须要做的最重要的修改是更新键的值( map.put(key,map.get(key)-1 )。扩展名:
另一个问题,对于其他数据结构(如列表或集合),是否有类似的方法可以做到这一点?
答案 0 :(得分:4)
最简单的方法是创建新地图:
final Map<?, ?> unmodifiable = Collections.unmodifiableMap(new HashMap<>());
final Map<?, ?> modifiable = new HashMap<>(unmodifiable);
两个映射均引用相同值。
扩展
对于列表和集合之类的集合,其工作方式类似。它们通常具有构造函数,您可以将另一个集合传递给该构造函数。
答案 1 :(得分:0)
不必创建新的列表或地图来更新其对象的状态。不能修改的是集合,而不是其中的对象。
List<Foo> mod = IntStream.range(1, 10).mapToObj(Foo::new).collect(
Collectors.toList());
List<Foo> unmod = Collections.unmodifiableList(mod);
// unmod.add(new Foo(20)); <-- can't do this
List<Foo> subList = unmod.subList(2, 4);
// subList.remove(0); <-- or this
Foo f = unmod.get(3);
f.v = 99; // <-- but this is allowed
System.out.println(unmod);
class Foo {
int v;
Foo(int v) {
this.v = v;
}
public String toString() {
return v + "";
}
}