List.of(...)或Collections.unmodifiableList()

时间:2016-09-08 08:05:01

标签: java collections java-9

如果您有List<String> strings个实例,请继续写下:

Collections.unmodifiableList(strings)

或切换到:

List.of(strings.toArray(new String[strings.size()]))

对于instantion的性能(内存和运行时)的初始影响是什么? List.of变体中是否有运行时优势?

2 个答案:

答案 0 :(得分:6)

这不是一个很好的比较,因为这些方法做了不同的事情:

  • Collections::unmodifiable...创建了一个不可修改的视图。 不可变,因为如果您正在更改原始备用集合(示例中为list),它就会更改。
  • 另一方面,
  • ...::of创建一个不可变的副本。更改原始列表不会影响它。

从性能视图可以看出,不可修改的包装器的创建更便宜,因为它只创建一个具有单个字段的实例。新工厂方法将创建至少一个对象,可能由数组支持(如果您有三个或更多元素),它需要复制到该对象中。

新的不可变集合上的访问速度可能更快,但必须进行基准测试。

但正确性胜过表现。你需要什么?如果您需要不可变的副本,请使用新方法(或我更喜欢的番石榴Immutable...)。如果您需要某些不可变的东西,请使用unmodifiable...并丢弃原始内容(并确保它保持原样)。如果您需要调用者无法编辑的视图,请使用unmodifiable...

答案 1 :(得分:4)

根据JEP 269 (Convenience Factory Methods for Collections)

  

<强>目标

     

在集合接口上提供静态工厂方法   创建紧凑的,不可修改的集合实例。 API是   故意保持最低限度。

     

<强>非目标

     
      
  • 提供一个完全通用的&#34;集合构建器&#34;并不是一个目标。   例如,让用户控制集合的工具   实施或各种特征,如可变性,预期   大小,加载因子,并发级别等。

  •   
  • 支持高性能,可扩展的集合并非目标   任意数量的元素。重点是小集合。

  •   
  • 提供不可修改的集合类型不是目标。那是,   该提案没有暴露出不可修改性的特征   类型系统,即使实际提出的实现   不可修改的。

  •   
  • 提供&#34;不可变的持久性&#34;不是一个目标。或&#34;功能性&#34;   集合。

  •