【问题标题】:List.of and List.copyOf methodsList.of 和 List.copyOf 方法
【发布时间】:2020-11-29 01:04:50
【问题描述】:

我知道 List.of 和 List.copyOf 创建原始列表的不可变克隆列表,所以在我的理解中,下面的代码应该在实际打印 [[1, 2] 时打印 [1], [1, 2] ]], [1, 2]? List.of 如何获取初始集合 col 的最新视图?

Collection<Number> col = new HashSet<>();
col.add(1);
var list1 = List.of(col); //1
col.add(2); //2
var list2 = List.copyOf(col); //3
System.out.println(list1+", "+list2);

【问题讨论】:

  • 在这种情况下,检查var 的推断类型(在大多数 IDE 中悬停)和/或将其替换为显式类型总是很有帮助的。

标签: java


【解决方案1】:

List.of 创建一个以参数s 作为元素的新列表。 List.copyOf 创建一个与 single Collection 参数具有相同元素的新列表。

伪代码示例(注意方括号):

List.of(1,2,3) == [1,2,3]
List.copyOf([1,2,3]) == [1,2,3]
List.of([1,2,3]) == [[1,2,3]]
List.of([1,2,3], [4,5,6]) == [[1,2,3], [4,5,6]]

第三行与您的代码中发生的情况类似。 of 创建一个将参数作为元素的列表。你给它什么参数?一组可修改的。因此它创建了一个包含单个元素的不可修改列表,该元素是您的可修改集。另请注意,of 不会复制该集合。

copyOf 创建了一个不可修改的列表,其中包含与您传入的集合相同的元素。您传入了 col,其中包含元素 12,因此它创建了一个不可修改的 List元素12

【讨论】:

  • 太棒了!非常感谢@Sweeper 的解释。非常感谢。
【解决方案2】:

当您执行 List.of(col) 时,实际上并没有向其中添加元素,而是添加了整个哈希集(作为参考),因此当您稍后将项目添加到哈希集中时,它会稍后显示。

【讨论】:

  • 谢谢 Ecto!非常感谢,我喜欢 List.of 实际上指向参考的解释。谢谢。
【解决方案3】:

两者都会创建不可修改的列表。但是使用copyOf,对基础集合的后续更改将不会传播,即在这种情况下不会通过list2 可见。

例如,如果你添加

col.add(3);

您会发现更改反映在 list1 中,而不是 list2

您可能还会发现这篇文章很有帮助: Java-How can i use correctly list.copyOf?

请参阅此处的 Java 文档了解更多信息: https://docs.oracle.com/javase/10/docs/api/java/util/List.html#unmodifiable

还有: https://docs.oracle.com/javase/10/docs/api/java/util/List.html#copyOf(java.util.Collection)

【讨论】:

    猜你喜欢
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2019-07-17
    • 2021-12-27
    • 2020-06-26
    • 2020-08-15
    • 2020-12-11
    相关资源
    最近更新 更多