是否可以制作不可修改地图的可修改副本?

时间:2019-11-25 14:58:16

标签: java data-structures

说明:

我的一个问题集随测试用例一起提供,以检查键入的代码是否正常工作。我不会详细介绍,但是基本上这些测试都将地图作为输入。我的代码适用于除以下情况以外的所有测试用例:当我看一下测试时,我发现输入映射被更改为不可修改的映射( Collections.unmodifiableMap(numbers)),并且不可修改的映射传递给我编写的方法。这是唯一的测试,因此我想知道是否可以复制此不可修改的地图,以便可以在我的方法中对其进行修改?

我必须要做的最重要的修改是更新键的值( map.put(key,map.get(key)-1 )。

扩展名:

另一个问题,对于其他数据结构(如列表或集合),是否有类似的方法可以做到这一点?

2 个答案:

答案 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 + "";
          }
       }