如果您有List<String> strings
个实例,请继续写下:
Collections.unmodifiableList(strings)
或切换到:
List.of(strings.toArray(new String[strings.size()]))
对于instantion的性能(内存和运行时)的初始影响是什么? List.of
变体中是否有运行时优势?
答案 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; 集合。