Подтвердить что ты не робот

Lists.newArrayList против нового ArrayList

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

это просто личное предпочтение?
или это просто тип типичного вывода типа?
или есть теоретическая или практическая ценность при использовании List.newArrayList()?

4b9b3361

Ответ 1

Конструктор guava сохраняет типичные аргументы несколько раз. Для сравнения:

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

Ответ 2

Из Источник Guava:

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

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

Ответ 3

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

Вот что делает List.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();

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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