gpt4 book ai didi

java - 为什么 Collections 类中的不可修改方法不使用新元素创建集合?

转载 作者:行者123 更新时间:2023-12-01 18:36:53 25 4
gpt4 key购买 nike

假设有这样的代码:

List<String> modifiableList = new ArrayList<String>(Arrays.asList("1","2","3"));
List<String> unmodifiableList = Collections.unmodifiableList(modifiableList);
System.out.println(unmodifiableList);
modifiableList.remove("1");
modifiableList.remove("3");
System.out.println(unmodifiableList);

打印

[1, 2, 3]
[2]

如果将第二行更改为

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

它按预期工作。问题是为什么 Collections 中的 UnmodifyingList 内部类(以及所有其他不可修改的类)不创建原始列表的新副本,就像 ArrayList 的构造函数那样code> 例如为了真正使其不可修改?

编辑:我明白代码的作用;我的问题是为什么要这样实现?为什么 UnmodifierList(来自 Collections 的内部类)的构造函数在创建底层数组的新副本时表现得与 ArrayList 的构造函数类似?为什么可修改集合 (ArrayList) 会复制整个内容,而不可修改集合则不会?

最佳答案

这些方法的目的是在现有集合上创建不可修改的 View 。这就是记录的行为,在许多情况下,这正是您想要的 - 例如,它比复制所有数据更有效......或者您希望向调用者提供集合,它反射(reflect)您的任何更改想要进行更改,但不允许他们进行更改。

如果您想要数据(或至少是引用...)的不可变副本,那么只需创建一个副本,然后在其顶部创建一个不可变 View - 就像您一样.

基本上,您可以根据执行 View 操作的 Collections.unmodifying* 本身轻松创建 View 或复制 View 。所以我们有两个正交运算:

  • 创建副本(例如通过构造函数)
  • 创建 View (通过 Collections.unmodifying*)

这些操作可以非常容易地组合。如果Collections.unmodifying*实际上执行了“仅复制”,那么我们需要其他操作才能只是创建 View 。如果您认为这两个选项在不同情况下都很有用,那么使它们可组合会带来很大的灵 active 。

关于java - 为什么 Collections 类中的不可修改方法不使用新元素创建集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21604298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com