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

Jac*_* G. 4 java collections factory-method java-10

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

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

Jac*_* G. 8

正如List#of,Set#of以及Map#ofEntries允许我们创建不可改变的在Java中实现9,该copyOf方法提供了一种方便的方法来创建不可改变从现有的实现CollectionS和MapS(取决于方法,作为Map#copyOf接受Map)在Java中10.

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

虽然,这些方法带来了几个注意事项(引述文件java.util.List):

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

为了告诫Set#copyOfMap#copyOf,参考它们的文档.

  • 这些方法的一个重要方面是它们是幂等的.复制以前复制的集合不会生成另一个副本. (8认同)
  • @Holger是的,实现包含:`if(coll instanceof ImmutableCollections.AbstractImmutableList){return(List <E>)coll;` (2认同)
  • @Eugene我认为,但是想知道,这是否是合同的一部分...... (2认同)