rak*_*khi 3 java java-8 java-10
根据doc,该方法Collections.unmodifiableList
返回指定列表的不可修改视图.返回的列表是否真的无法修改?不可修改的观点是什么意思?
根据doc,该方法Collectors.toUnmodifiableList
返回一个Collector,它将输入元素累积到遇到顺序的不可修改的List中.这里返回的列表真的无法修改吗?
注意:通过可修改,我的意思是可以使用set
操作修改视图.我想了解它们之间的区别以及它们之间的关系?
该方法Collections.unmodifiableList
返回指定列表的不可修改视图.不可修改的视图集合是一个不可修改的集合,也是一个支持集合的视图.请注意,可能仍然可以对支持集合进行更改,如果它们发生,则通过不可修改的视图可以看到它们.
List<String> srcList = Arrays.asList("Apple", "Banana", "Cherry");
var fruits = new ArrayList<>(srcList);
var unmodifiableList = Collections.unmodifiableList(fruits);
fruits.set(0, "Apricot");
var modFruit = unmodifiableList.get(0);
System.out.println(modFruit); // prints Apricot
Run Code Online (Sandbox Code Playgroud)
我们可以在Java 10及更高版本中拥有一个真正的不可变列表.有两种方法可以获得真正不可修改的列表,如下所示:
var unmodifiableList = List.copyOf(srcList);
=>打印Applevar unmodifiableList = srcList.stream().collect(Collectors.toUnmodifiableList());
=>打印Apple因此,该方法Collectors.toUnmodifiableList
返回List.of
Java 9 中引入的真正的不可修改列表.当方法返回列表时,此方法返回Collector
where Collections.unmodifiableList
.根据文档,不可修改的列表具有以下特征:
- 它们是不可修改的.无法添加,删除或替换元素.在List上调用任何mutator方法总是会
UnsupportedOperationException
引发抛出.但是,如果包含的元素本身是可变的,则可能导致List的内容看起来发生变化.- 他们不允许使用null元素.尝试使用null元素创建它们会导致
NullPointerException
.- 如果所有元素都可序列化,则它们是可序列化的.
- 列表中元素的顺序与提供的参数的顺序或提供的数组中的元素的顺序相同.
- 他们是
value-based
.调用者不应对返回实例的身份做出任何假设.工厂可以自由创建新实例或重用现有实例.因此,对这些实例的身份敏感操作(引用相等(==),标识哈希代码和同步)是不可靠的,应该避免.- 它们按序列化表单页面上的指定进行序列化.
归档时间: |
|
查看次数: |
465 次 |
最近记录: |