Lists.newArrayList与新的ArrayList

ase*_*a38 70 java generics guava

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

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

Boz*_*zho 89

番石榴构建器可以多次保存键入类型参数.相比:

List<Foo<Bar, Baz>> list = Lists.newArrayList();
List<Foo<Bar, Baz>> list = new ArrayList<Foo<Bar, Baz>>();
Run Code Online (Sandbox Code Playgroud)

在Java 7中,它有点过时,因为你有钻石操作符:

List<Foo<Bar, Baz>> list = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

  • 由于重载,它并不是过时的 - "Lists.newArrayList(1,2,3)`允许你用元素初始化,而`Lists.newArrayListWithExpectedSize(20)`使得'20'的含义比`new更明显的ArrayList <>(20)`.顺便说一下,这个问题的"正式答案"是[这里](http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Static_constructors). (35认同)
  • 是的,但这是另一种方法.我的意思是没有arg的一个是过时的. (13认同)
  • @PaulBellora但是在Guavas Lists上创建一个静态导入(因此没有减少导入,也没有丢失对ArrayList的传递依赖,如果这是你的目标). (10认同)
  • 为了它的价值,它还使调用站点不必导入`ArrayList`. (4认同)
  • 我总是只使用List <Foo <Bar,Baz >> list = new ArrayList(); (2认同)

Pau*_*ora 30

来自番石榴的来源:

public static <E> ArrayList<E> newArrayList() {
    return new ArrayList<E>();
}
Run Code Online (Sandbox Code Playgroud)

所有这一切都是允许类型推断 - 在运行时没有区别.


卢声远*_* Lu 14

添加一个点,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);
Run Code Online (Sandbox Code Playgroud)