Java 番石榴不可变列表副本vs生成器
我想知道哪个更有效,为什么 (一)Java 番石榴不可变列表副本vs生成器,java,guava,Java,Guava,我想知道哪个更有效,为什么 (一) 列出foo; ... 返回ImmutableList.copyOf(foo); 或 (二) 列出foo; ... 返回新的ImmutableList.Builder().addAll(foo.build(); 我看不出您在此处使用builder的任何理由: ImmutableList.copyOf比创建一个Builder更具可读性 Builder不推断泛型类型,您必须通过 你自己当一个班轮 (来自文档)ImmutableList.copyOf当与另一个不可
列出foo;
...
返回ImmutableList.copyOf(foo);
或
(二)
列出foo;
...
返回新的ImmutableList.Builder().addAll(foo.build();
我看不出您在此处使用builder的任何理由:
比创建一个ImmutableList.copyOf
更具可读性Builder
不推断泛型类型,您必须通过 你自己当一个班轮Builder
- (来自文档)
当与另一个不可变集合一起调用时(在安全的情况下尝试避免实际复制数据)ImmutableList.copyOf
- (源代码)
调用先前创建的Builder#addAll
上的ArrayList
,而addAll
避免为零元素和一元素集合创建任何列表(分别返回空的不可变列表和单元素不可变列表)copyOf
- (来自源代码)
实例不创建临时copyOf(集合)
(ArrayList
和copyOf(Iterable)
这样做)copyOf(迭代器)
- (源代码)此外,
在以前内部填充的Builder#build
上调用ArrayList
,您的问题是什么?当您有copyOf
时,为什么在这里使用copyOf
Builder
另外,我个人使用
ImmutableList.builder()
静态工厂,而不是新的ImmutableList.builder()
构造函数-当分配给builder
变量时,第一个变量推断泛型类型,而后者不推断泛型类型。builder允许您添加内容。也就是说,如果需要添加另一个对象,那么使用生成器模式可能更容易:
ImmutableList<SomeModel> newModelObjects = new ImmutableList.Builder<SomeModel>()
.addAll(getModelObjects()).add(newModelObject).build();
ImmutableList newModelObjects=newImmutableList.Builder()
.addAll(getModelObjects()).add(newModelObject.build();
与之相反:
ArrayList<SomeModel> list = new ArrayList<>(getModelObjects());
list.add(newModelObject);
ImmutableList<SomeModel> newModelObjects = ImmutableList.copyOf(list);
ArrayList list=newArrayList(getModelObjects());
添加(newModelObject);
ImmutableList newModelObjects=ImmutableList.copyOf(列表);
您是否已确定这是您的性能瓶颈?因为除非你有一个特别的原因来关心这方面的效率,否则你现在应该忽略这一方面,而使用可读性更强的一个(即第一个)。在我开始在我的项目中使用番石榴之前,我只是好奇。我不确定哪种方法是“正确的”,如果有一种简单的单一方法调用方法可以完全满足您的需要,并且一个对象构造和两个方法调用可以(某种程度上)完成相同的事情,那么每次我都会选择一种更简单的方法。@user973479如果您想到的首要问题是哪种方法更有效,这是错误的。如果由于某种反常的自然现象,单个方法调用的效率较低,那么不管怎样,这只是一个最终会有人修复的bug。想要了解什么更有效以及库是如何工作的并不是误导。只有当你因为性能原因而喜欢阅读较难的内容,而没有充分的理由关心上下文中的性能时,这才是错误的。问题是“什么更有效,为什么不”我应该使用哪个。谢谢你的详细解释!
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);