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

标签 java list collections unmodifiable

假设有这样的代码:

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/

相关文章:

python - 如何过滤具有列表的列的数据框包含值

python - 在 Python 中从 UTF-8 解析为 XML

java - Collections.emptyList() 和/或 Java 泛型方法的奇怪类型推断行为?

java - jackson 将多个对象序列化为一个

Java运行时错误

CSS 定位 - 无序列表

javascript - Mongoose - 设置关系在计划中失败

collections - NoSQL 数据库设计 : graph, 文档,边缘..?

java - 如何获取 Netty 4 应用程序的直接内存快照

java - 获取用户在 Google Plus 上的职位