NewArrayList 和 new ArrayList

创建字符串 List的最佳结构是什么? 是 Lists.newArrayList()(来自番石榴)还是 new ArrayList()

只是个人偏好吗?
还是只是类型泛型类型推断?
或者使用 Lists.newArrayList ()是否有任何理论或实际价值?

109205 次浏览

番石榴生成器保存多次键入类型参数:

List<Foo<Bar, Baz>> list = Lists.newArrayList();
List<Foo<Bar, Baz>> list = new ArrayList<Foo<Bar, Baz>>();

但是在 Java7中它有点过时了,因为有菱形运算符:

List<Foo<Bar, Baz>> list = new ArrayList<>();

来自 番石榴的来源:

public static <E> ArrayList<E> newArrayList() {
return new ArrayList<E>();
}

所做的一切就是允许类型推断——在运行时没有区别。

正如解释的 给你,使用 ListsSets等的主要动机是提高代码的可读性/重复性,以及类型推断。

正如前面提到的,Java7使这种方法过时了,但我使用 Factory 方法是因为它使得以后更改列表、集合、映射或其他类型变得更加容易。

这就是 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.newArrayList ()的 超载版本更有用:

  • Lists.newArrayList(E... elements)
  • Lists.newArrayList(Iterable<? extends E> elements)
  • Lists.newArrayList(Iterator<? extends E> elements)

提供比 new ArrayList()更有用的函数。

例如: new ArrayList()不能做:

Lists.newArrayList("a","b");
Lists.newArrayList(anIterable);

用于重载构造函数的 Java8方法。

如果您希望使用来自 Guava 的重载构造函数,我推荐使用 Java8StreamBuilder 的另一种方法。

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");

你可以使用 java.util中的 Arrays.asList(),这样你就不必使用番石榴:

List<String> list = Arrays.asList("one","another", null, "one_more")

(顺便说一下,Java8中的 Stream Builder 也是一个选项,但是对于大多数常见用例来说,它过于冗长和过度)