不可变与不可修改的集合

新手上路,请多包涵

来自 集合框架概述

不支持修改操作的集合(例如 addremoveclear )被称为 不可修改 的。不可修改的集合是 可修改 的。

额外保证 Collection 对象没有变化的集合被称为 不可变 的。不是不可变的集合是 可变 的。

我无法理解其中的区别。

这里不可 修改不可变 有什么区别?

原文由 Cratylus 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 758
2 个回答

不可修改的集合通常是 其他代码仍可访问 的可修改集合的包装器。因此,如果 只有对不可修改集合的引用,则无法对其进行任何更改,但您不能依赖内容不变。

不可变 集合保证 没有任何东西 可以再改变集合。如果它包装了一个可修改的集合,它确保没有其他代码可以访问该可修改的集合。请注意,虽然没有代码可以更改集合包含引用的对象,但对象本身可能仍然是可变的——创建一个不可变的集合 StringBuilder 不会以某种方式“冻结”这些对象。

基本上,不同之处在于其他代码是否可以在您背后更改集合。

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 3.0 许可协议

基本上 unModifiable 集合是一个视图,因此它仍然可以间接地从其他一些可修改的引用中“修改”。此外,由于它只是另一个集合的 只读视图,当源集合更改时,不可修改的集合将始终显示最新值。

但是 immutable 集合可以被视为另一个集合的 只读副本,不能修改。在这种情况下,当源集合发生变化时,不可变集合不会反映这些变化

这是一个可视化这种差异的测试用例。

 @Test
public void testList() {

    List<String> modifiableList = new ArrayList<String>();
    modifiableList.add("a");

    System.out.println("modifiableList:"+modifiableList);
    System.out.println("--");

    //unModifiableList

    assertEquals(1, modifiableList.size());

    List<String> unModifiableList=Collections.unmodifiableList(
                                        modifiableList);

    modifiableList.add("b");

    boolean exceptionThrown=false;
    try {
        unModifiableList.add("b");
        fail("add supported for unModifiableList!!");
    } catch (UnsupportedOperationException e) {
        exceptionThrown=true;
        System.out.println("unModifiableList.add() not supported");
    }
    assertTrue(exceptionThrown);

    System.out.println("modifiableList:"+modifiableList);
    System.out.println("unModifiableList:"+unModifiableList);

    assertEquals(2, modifiableList.size());
    assertEquals(2, unModifiableList.size());
            System.out.println("--");

            //immutableList

    List<String> immutableList=Collections.unmodifiableList(
                            new ArrayList<String>(modifiableList));

    modifiableList.add("c");

    exceptionThrown=false;
    try {
        immutableList.add("c");
        fail("add supported for immutableList!!");
    } catch (UnsupportedOperationException e) {
        exceptionThrown=true;
        System.out.println("immutableList.add() not supported");
    }
    assertTrue(exceptionThrown);

    System.out.println("modifiableList:"+modifiableList);
    System.out.println("unModifiableList:"+unModifiableList);
    System.out.println("immutableList:"+immutableList);
    System.out.println("--");

    assertEquals(3, modifiableList.size());
    assertEquals(3, unModifiableList.size());
    assertEquals(2, immutableList.size());

}

输出

modifiableList:[a]
--
unModifiableList.add() not supported
modifiableList:[a, b]
unModifiableList:[a, b]
--
immutableList.add() not supported
modifiableList:[a, b, c]
unModifiableList:[a, b, c]
immutableList:[a, b]
--

原文由 Prashant Bhate 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏