Пять способов инициализировать список в Java

Java задняя часть

Инициализировать в JavaListпять способов

Списки часто используются в Java, вот несколько распространенных методов инициализации.

1. СтроительствоListпосле использованияList.addинициализация

List<String> stringList = new LinkedList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");

Это самая распространенная практика, и ее не очень удобно использовать.

2. Используйте{{}}синтаксис двойной скобки

List<String> stringList = new LinkedList<String>(){{
    add("a");
    add("b");
    add("c");
}};

Этот способ относительно удобен.

Внешний{}Определяет анонимный внутренний класс LinkedList. внутренний{}определяет блок кода инициализации экземпляра. Этот блок кода выполняется при инициализации внутреннего класса. Итак, здесь эквивалентно определению анонимного внутреннего класса и использованиюaddДобавьте элементы для инициализации.

Этот подход имеет несколько недостатков:

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

3. ИспользуйтеArrays.asList

List<String> stringList = Arrays.asList("a", "b", "c");

Этот способ используется таким образом.java.util.Arraysстатический метод. Метод написания более лаконичен, чем два предыдущих, и нет проблем с эффективностью при построении анонимных внутренних классов.

Но есть несколько замечаний:

  • Arrays.asListто, что возвращаетсяArraysСтатический внутренний класс (статический внутренний класс не содержит ссылки на внешний класс, в котором он находится).

Этот внутренний класс наследуется отAbstractList, выполненоRandomAccess, который внутренне использует массив для хранения элементов. Однако добавление или удаление элементов не поддерживается. Это требует внимания. если просто использоватьArrays.asListинициализировать константу, то это не проблема.

  • Arrays.asListЕсли параметр представляет собой массив примитивных типов, вы должны знать, что возвращаемое значение может отличаться от ожидаемого.
int[] intArray = new int[]{1, 2, 3};
Integer[] integerArray = new Integer[]{1, 2, 3};
 
List<int[] > intArrayList = Arrays.asList(intArray);
List<Integer> integerList = Arrays.asList(integerArray);
List<Integer> integerList2 = Arrays.asList(1, 2, 3);

здесьArrays.asList(intArray)Возвращаемое значениеList<int[]>вместоList<Integer>. Это вообще не проблема, просто нужно быть осторожным при использовании. Если вы можете максимально использовать List и Integer в Java, старайтесь избегать использования базовых типов, таких как int и[]Этой низкоуровневой структуры данных можно избежать.

Небольшое отступление: В конце концов, Java нельзя назвать полностью объектно-ориентированным. В конце концов, такие вещи, как примитивные типы данных, сохраняются. Это правда, что примитивные типы данных используются более эффективно, чем соответствующие инкапсулированные типы. Но это также вносит некоторую путаницу в процесс использования: должны ли мы использовать базовые типы или инкапсулированные типы, когда мы должны использовать это и когда мы должны использовать что? Хотя Java предоставляет пользователям больше возможностей для выбора, создается впечатление, что проблема остается за пользователем. На мой взгляд, одним из преимуществ Java по сравнению с C++ является то, что многие вещи ограничены, и есть более четкие и понятные определения, которые уменьшают двусмысленность и легче воспринимаются. Но здесь базовые типы данных по-прежнему кажутся тенью, оставленной Java как языком, улучшающим недостатки C++.

Хотя в этой статье речь идет об инициализацииList, но вот{{}}Синтаксис двойной скобки также можно использовать для инициализации.Mapи многие другие виды. Условно говоря,Arrays.asListможно использовать только для инициализацииListтипа тоже.

4. ИспользуйтеStream (JDK8)

List<String> list = Stream.of("a", "b", "c").collect(Collectors.toList());

Используйте поток JDK8 для инициализации. Простая инициализация List с использованием Stream немного излишняя.

5. ИспользуйтеLists(JDK9)

List<String> list = Lists.newArrayList("a", "b", "c");

это иArrays.asListТак же лаконично и ясно.

Ссылаться на

Double Brace Initialization

How to initialize List object in Java?