Lists.newArrayList与新ArrayList


73

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

只是个人喜好吗?
还是仅仅是Type泛型类型推断?
还是使用Lists.newArrayList()有任何理论或实践价值?


Answers:


95

番石榴生成器保存多次键入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<>();

36
由于重载,它还不是很陈旧-Lists.newArrayList(1, 2, 3)让您可以使用元素进行初始化,Lists.newArrayListWithExpectedSize(20)并使意义20比更加明显new ArrayList<>(20)。顺便说一下,这个问题的“官方答案”在这里
Louis Wasserman

14
是的,但这是另一种方法。我的意思是无参的已经过时了。
博若

4
就其价值而言,它也使呼叫站点无需导入ArrayList
Paul Bellora '04年

2
我总是只使用List <Foo <Bar,Baz >> list = new ArrayList();
2013年

10
@PaulBellora而是在番石榴列表上创建静态导入(因此,如果您的目标是减少导入,也不会丢失对ArrayList的传递依赖性)。
Dag 2013年


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

4

这是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();可以工作。
Matthias Wimmer

3

正如解释在这里,主要的动机使用ListsSets等是改善你的代码的可读性/重复,并为类型推断。


2

重载构造函数的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")呢?)
aioobe

@aioobe-也可以,但是仅当您在一行中拥有所有可用元素(例如声明或硬编码值)时,它才起作用。但是,如果必须迭代值以创建新列表,则Stream Builder将是一个更好的选择。
Rituraj

1

如前所述,Java 7使其过时了,但是我使用了factory方法,因为它使得更改列表,集合,映射或其他类型的类型变得更加容易。


0

您可以使用Arrays.asList()from,java.util因此您不必使用番石榴:

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

(顺便说一句,Java 8的Stream Builder也是一个选项,但是对于大多数常见用例来说,它太冗长和过大)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.