【问题标题】:Guava ImmutableList copyOf vs BuilderGuava ImmutableList copyOf vs Builder
【发布时间】:2012-03-01 13:38:42
【问题描述】:

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

1)

List<Blah> foo;
...
return ImmutableList.copyOf(foo);

2)

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

【问题讨论】:

  • 您是否认为这是您的性能瓶颈?因为除非您有特定理由来关心它的效率,否则您现在应该忽略该方面并使用更易读的方面(即第一个方面)。
  • 在我开始在我的项目中使用 Guava 之前,我只是好奇。我不确定哪个是“正确”的方式
  • 如果有一个简单的单方法调用方式可以完全满足您的要求,并且有一个对象构造和两种方法调用方式来做(某种)相同的事情,那么我每次都会选择更简单的一个。
  • @user973479 甚至在你脑海中的首要问题是哪个更有效是错误的。如果出于某种怪异的原因,单个方法调用的效率较低,那将只是一个最终有人会修复的错误。
  • 想要了解什么更有效以及图书馆是如何工作的并不是错误的。如果您因为性能而更喜欢更难阅读的书,而没有充分的理由关心上下文中的性能,那么这只会被误导。问题是“什么更有效,为什么”而不是“我应该使用哪个”。

标签: java guava


【解决方案1】:

我看不出你应该在这里使用 builder 的任何理由:

  • 在这种情况下,ImmutableList.copyOfBuilder 更具可读性,
  • Builder 不推断泛型类型,您必须指定类型 当用作单线时,您自己,
  • (来自文档) ImmutableList.copyOf does good magic 与另一个不可变集合一起调用时(在安全的情况下尝试避免实际复制数据),
  • (来自源代码) Builder#addAll 在先前创建的 ArrayList 上调用 addAllcopyOf 避免为零元素和一元素集合创建任何列表(分别返回空的不可变列表和单例不可变列表),
  • (来自源代码) copyOf(Collection) 实例不会创建临时的 ArrayListcopyOf(Iterable)copyOf(Iterator) 会这样做),
  • (来自源代码)此外,Builder#build 在先前内部填充的ArrayList 上调用copyOf,是什么让你想到了你的问题——为什么在这里使用Builder,当你有copyOf 时?

附:我个人使用 ImmutableList.builder() 静态工厂而不是 new ImmutableList.Builder&lt;Blah&gt;() 构造函数 - 当分配给 Builder&lt;Blah&gt; 变量时,第一个推断泛型类型,而后者不推断。

【讨论】:

  • 感谢详细的解释!
【解决方案2】:

Builder 允许你添加东西。 IE。如果您需要添加另一个对象,使用 Builder 模式可能会更容易:

ImmutableList<SomeModel> newModelObjects = new ImmutableList.Builder<SomeModel>()
    .addAll(getModelObjects()).add(newModelObject).build();

相对于:

ArrayList<SomeModel> list = new ArrayList<>(getModelObjects());
list.add(newModelObject);
ImmutableList<SomeModel> newModelObjects = ImmutableList.copyOf(list);

【讨论】:

    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2020-10-14
    • 1970-01-01
    相关资源
    最近更新 更多