Lists.newArrayList против нового ArrayList - PullRequest
66 голосов
/ 02 апреля 2012

Какова лучшая конструкция для создания List строк?Это Lists.newArrayList() (из гуавы) или new ArrayList()?

это просто личное предпочтение?
или это просто вывод общего типа?
или есть какое-то теоретическое или практическое значениев использовании Lists.newArrayList ()?

Ответы [ 7 ]

86 голосов
/ 02 апреля 2012

Строитель гуавы сохраняет набираемые аргументы типа несколько раз.Сравните:

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

В Java 7 это немного устарело, потому что у вас есть оператор diamond:

List<Foo<Bar, Baz>> list = new ArrayList<>();
29 голосов
/ 02 апреля 2012

Из Источник Гуавы :

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

Все, что он делает, это позволяет сделать вывод типа - без разницы во время выполнения.

13 голосов
/ 03 апреля 2012

Добавить одну точку, перегрузка версия 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 голосов
/ 02 апреля 2012

Это то, что делает 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();
3 голосов
/ 02 апреля 2012

Как объяснено здесь , основные мотивы использования Lists, Sets и т. Д. Состоят в том, чтобы улучшить читаемость / дублирование в вашем коде и вывод типа.

2 голосов
/ 13 июля 2017

Java 8 подход для перегруженных конструкторов.

Если вы хотите использовать перегруженные конструкторы из Guava, я бы порекомендовал другой способ, используя Java 8 Stream Builder.

List<String> listTest = Stream.<String>builder.add("Hello").add("My Name").add("Blah").build().collect(Collectors.toList());
1 голос
/ 02 апреля 2012

Как уже отмечалось, Java 7 делает это устаревшим, но я использую фабричный метод, потому что он упрощает изменение типа списка, набора, карты или любого другого позже.

...