Инициализировать в 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
Так же лаконично и ясно.