当前位置: 首页 > 面试题库 >

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

公西浩
2023-03-14
问题内容

如果您有List<String> strings实例,可以继续写:

Collections.unmodifiableList(strings)

或切换至:

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

实例化对性能(在内存和运行时方面)的最初影响是什么?该List.of变体有运行时优势吗?


问题答案:

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

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

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

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

但是正确性胜过性能。您 需要 什么?如果您需要一个不变的 副本
,请使用新方法(或Immutable...我希望使用的Guava的方法)。如果您需要不变的 东西
,请使用unmodifiable...并丢弃原件(并确保原样保持原样)。如果需要呼叫者无法编辑的视图,请使用unmodifiable...



 类似资料:
  • 问题内容: 作为一个特例List.of(…)或Collections.unmodifiableList() -什么是指向一个的首选的Java 9路 空 和 不可变 列表? 继续写 或切换到 问题答案: Java 9指向空且不可变列表的首选方式是什么? 差异相当细微,因此“首选”取决于您要实现的目标。一些行为上的差异: 如果调用由于某种奇怪的原因而发生,将引发异常。 您可以反序列化JDK 8及更高版

  • 问题内容: Java 9引入了新的列表工厂方法: 上一个选项和新选项之间有什么区别?也就是说,这之间有什么区别: 还有这个: 问题答案: 返回可变的列表,而所返回的列表是不可变的: 允许null元素,而不允许: 行为与null不同: 返回所传递数组的视图,因此对数组的更改也将反映在列表中。对于这是不正确的:

  • 我在返回时发现了错误。Java似乎不知道如何解析方法中的方法。

  • 我正在使用springboot和gradle,我正在尝试在控制器中执行下面的代码。 在编译时,我得到以下错误 错误:找不到symbol=List.of(“水星”,“金星”,“地球”,“火星”,^symbol:方法of(String,String,String,String,String,String,String,String,String,String) 位置:接口列表 我的分级档案 sourc

  • 这是一种方法: 我对lambda表达式的理解很差,“expression”部分必须返回一个值,在这种情况下,它必须是字符串 So<代码>()- 既然如此,为什么要用lambda表达式呢? 为什么不直接列出。“已读”?