来自 集合框架概述:
不支持修改操作的集合(例如
add
,remove
和clear
)被称为 不可修改 的。不可修改的集合是 可修改 的。额外保证
Collection
对象没有变化的集合被称为 不可变 的。不是不可变的集合是 可变 的。
我无法理解其中的区别。
这里不可 修改 和 不可变 有什么区别?
原文由 Cratylus 发布,翻译遵循 CC BY-SA 4.0 许可协议
来自 集合框架概述:
不支持修改操作的集合(例如
add
,remove
和clear
)被称为 不可修改 的。不可修改的集合是 可修改 的。额外保证
Collection
对象没有变化的集合被称为 不可变 的。不是不可变的集合是 可变 的。
我无法理解其中的区别。
这里不可 修改 和 不可变 有什么区别?
原文由 Cratylus 发布,翻译遵循 CC BY-SA 4.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 许可协议
15 回答8.2k 阅读
8 回答6k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
不可修改的集合通常是 其他代码仍可访问 的可修改集合的包装器。因此,如果 您 只有对不可修改集合的引用,则无法对其进行任何更改,但您不能依赖内容不变。
不可变 集合保证 没有任何东西 可以再改变集合。如果它包装了一个可修改的集合,它确保没有其他代码可以访问该可修改的集合。请注意,虽然没有代码可以更改集合包含引用的对象,但对象本身可能仍然是可变的——创建一个不可变的集合
StringBuilder
不会以某种方式“冻结”这些对象。基本上,不同之处在于其他代码是否可以在您背后更改集合。