创建List
String的最佳构造是什么?是Lists.newArrayList()
(来自番石榴)还是new ArrayList()
?
只是个人喜好吗?
还是仅仅是Type泛型类型推断?
还是使用Lists.newArrayList()有任何理论或实践价值?
Answers:
番石榴生成器保存多次键入type参数。比较:
List<Foo<Bar, Baz>> list = Lists.newArrayList();
List<Foo<Bar, Baz>> list = new ArrayList<Foo<Bar, Baz>>();
在Java 7中,它有些过时了,因为您拥有菱形运算符:
List<Foo<Bar, Baz>> list = new ArrayList<>();
Lists.newArrayList(1, 2, 3)
让您可以使用元素进行初始化,Lists.newArrayListWithExpectedSize(20)
并使意义20
比更加明显new ArrayList<>(20)
。顺便说一下,这个问题的“官方答案”在这里。
ArrayList
。
这是Lists.newArrayList的作用:
@GwtCompatible(serializable = true)
public static <E> ArrayList<E> newArrayList() {
return new ArrayList<E>();
}
因此,这两个基本相同,使用newArrayList的优点是不必重复泛型类型。这对复杂的泛型非常有用:
List<Map<X,List<Y>> list = new ArrayList<Map<X,List<Y>>();
List<Map<X,List<Y>> list = Lists.newArrayList();
Lists.<Map<X,List<YY>>>newArrayList()
。您可以省略泛型类型。但是您也可以使用构造函数来做到这一点:也List<Map<X,List<Y>>> list = new ArrayList();
可以工作。
重载构造函数的Java 8方法。
如果您想使用Guava中的重载构造函数,我建议使用Java 8 Stream Builder的另一种方法。
List<String> listTest = Stream.<String>builder
.add("Hello").add("My Name").add("Blah")
.build().collect(Collectors.toList());
如果您使用的是Java 9+版本,则可以在下面使用。但是此方法返回一个ImmutableList,因此您不能向其添加更多元素。
List.of("My","Name", "IS", "this");
Stream.of("Hello", "My Name", "Blah")
呢?)