Guava ImmutableList copyOf vs Builder

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

1)

List foo; ... return ImmutableList.copyOf(foo); 

要么

2)

 List foo; ... return new ImmutableList.Builder().addAll(foo).build(); 

我没有看到你为什么要在这里使用建设者的原因:

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

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