我知道list.of和list.copyof会创建原始列表的不可变克隆列表,因此在我的理解中,下面的代码在实际打印1,2,[1,2]时应该打印[1],[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);
3条答案
按热度按时间62lalag41#
两者都将创建不可修改的列表。但与
copyOf
,则对基础集合的后续更改将不会传播,即不会通过list2
在这种情况下。例如,如果您添加
你会发现这种变化反映在
list1
,但不是list2
.你可能也会发现这篇文章很有帮助:java如何正确使用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)集合
x4shl7ld2#
当您执行list.of(col)时,实际上并不向其中添加元素,而是添加整个哈希集(作为引用),因此当您稍后向哈希集中添加一个项时,它将在稍后显示。
ne5o7dgx3#
List.of
创建一个以参数为元素的新列表。List.copyOf
创建一个新列表,其元素与单个列表相同Collection
争论。伪代码示例(请注意方括号):
第三行类似于代码中发生的事情。
of
创建一个将参数作为元素的列表。你给出了什么参数?一个可修改的集合。所以它创建了一个不可修改的列表,其中只有一个元素,这个元素就是您的可修改集。还要注意的是of
不复制集合。copyOf
使用与传入的集合相同的元素创建不可修改的列表。你过去了col
,其中包含1
,2
,因此它创建了一个不可修改的List
与元素1
,2
.