List#copyOf,Set#copyOf和Map#copyOf与传统方法的区别是什么?

时间:2018-03-03 22:09:55

标签: java collections factory-method java-10

Java 10的发布带来了新的静态工厂方法,特别是:

由于这些方法允许我们将Collection复制到不同的Collection实现中,它们如何与现有方法进行比较和对比?

1 个答案:

答案 0 :(得分:7)

正如List#ofSet#ofMap#ofEntries允许我们在Java 9中创建不可修改的实现一样,copyOf方法提供了方便从现有的CollectionMap创建不可修改的实现的方法(取决于方法,因为Map#copyOf在Java 10中接受Map

这使我们可以轻松地从Set<E>创建不可修改的 List<E>,反之亦然。

尽管如此,这些方法带来了一些警告(引用java.util.List的{​​{3}}):

  
      
  • 他们是不可修改的。无法添加,删除或替换元素。在List上调用任何mutator方法将始终导致抛出UnsupportedOperationException。但是,如果包含的元素本身是可变的,则可能导致列表内容看起来发生变化。
  •   
  • 他们不允许使用null元素。尝试使用null元素创建它们会导致NullPointerException。
  •   
  • 如果所有元素都是可序列化的,则它们是可序列化的。
  •   
  • 列表中元素的顺序与提供的参数或提供的数组中元素的顺序相同。
  •   
  • 他们是以价值为基础的。调用者不应对返回实例的身份做出任何假设。工厂可以自由创建新实例或重用现有实例。因此,对这些实例的身份敏感操作(引用相等(==),身份哈希代码和同步)是不可靠的,应该避免。
  •   
  • 按序列化表格页面上的指定序列化它们。
  •   

有关Set#copyOfMap#copyOf的警告,请参阅他们的文档。