Guava ImmutableList copyOf vs Builder

use*_*479 14 java guava

我想知道哪个更有效率,为什么?

1)

List<Blah> foo;
...
return ImmutableList.copyOf(foo);
Run Code Online (Sandbox Code Playgroud)

要么

2)

List<Blah> foo;
...
return new ImmutableList.Builder<Blah>().addAll(foo).build();
Run Code Online (Sandbox Code Playgroud)

Xae*_*ess 29

我没有看到你在这里使用构建器的任何理由:

  • ImmutableList.copyOfBuilder在这种情况下制作更具可读性,
  • Builder 不推断泛型类型,你必须自己指定类型作为单行,
  • (来自docs) 在使用另一个不可变集合调用时会ImmutableList.copyOf 做出很好的魔术(尝试避免在安全的情况下实际复制数据),
  • (来自源代码) Builder#addAll调用addAll先前创建的,ArrayList同时copyOf避免为零元素和单元素集合创建任何列表(分别返回空的不可变列表和单例不可变列表),
  • (来自源代码) copyOf(Collection)实例不会创建临时ArrayList(copyOf(Iterable)并且copyOf(Iterator)这样做),
  • (来自源代码)此外,Builder#build调用copyOf以前内部填充的ArrayList,什么带给你你的问题 - 为什么Builder在这里使用,当你有copyOf

PS我个人使用ImmutableList.builder()静态工厂而不是new ImmutableList.Builder<Blah>()构造函数 - 当分配给Builder<Blah>变量时,第一个推断泛型类型,而后者则不是.