Lists.newArrayList vs新的ArrayList

创build一个stringList的最佳构造是什么? 它是Lists.newArrayList() (从番石榴)或new ArrayList()

这只是个人喜好吗?
还是只是键入genericstypes推断?
或者在使用Lists.newArrayList()有没有任何理论或实际价值?

番石榴生成器保存inputtypes参数多次。 比较:

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

从番石榴的来源 :

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

所有这一切都允许types推断 – 在运行时没有区别。

加一点, 重载版本的Lists.newArrayList()更有用:

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

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

例如: new ArrayList()不能这样做:

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

这就是Lists.newArrayList所做的事情:

 @GwtCompatible(serializable = true) public static <E> ArrayList<E> newArrayList() { return new ArrayList<E>(); } 

所以这两个基本上是一样的,使用newArrayList的优点是不必复制genericstypes。 这对复杂的generics非常有用:

 List<Map<X,List<Y>> list = new ArrayList<Map<X,List<Y>>(); List<Map<X,List<Y>> list = Lists.newArrayList(); 

正如这里所解释的那样,使用ListsSets等的主要动机是提高代码中的可读性/重复性以及types推断。

如前所述,Java 7使得这个过时了,但是我使用了工厂方法,因为它可以在以后更改列表,集合,映射或其他types。

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

如果您想使用Guava的重载构造函数,我会推荐使用Java 8 Stream Builder的另一种方法。

 List<String> listTest = Stream.<String>builder.add("Hello").add("My Name").add("Blah").build().collect(Collectors.toList());