Научитесь преобразовывать список в массив в Java, а также преобразовывать заданный массив в список. Мы изучим преобразования с использованием основных API Java.
- В Java списки представляют собой упорядоченные на основе индекса коллекции, которые обеспечивают произвольный доступ к элементам по их целочисленному индексу.
- Массивы также похожи на списки, но хранятся в непрерывной памяти. Вот почему изменение размера массивов — дорогостоящая операция.
1. Преобразование списка в массив
Для преобразования заданного списка в массив можно использовать следующие два подхода.
1.1.Список.вМассив()
Использование list.toArray() — самый простой способ преобразования списка в массив. Это перегруженная функция.
- Object[] toArray() : возвращает массив, содержащий все элементы в списке.
- <T> T[] toArray(T[] a) : возвращает массив, содержащий все элементы в списке, а тип возвращаемого массива соответствует указанному массиву a.
Если коллекция помещается в указанный массив, она возвращается в нем. В противном случае выделяется новый массив размером с указанный список. Если указанный массив больше списка, то свободные индексы заполняются нулем. - default <T> T[] toArray(IntFunction<T[]> generator) : возвращает массив, содержащий все элементы в списке, а предоставленная функция генератора используется для выделения возвращаемого массива.
Давайте рассмотрим несколько примеров этих методов.
List<String> list = Arrays.asList("A", "B", "C");String[] stringArray;//1Object[] objArray = list.toArray();//2stringArray = list.toArray(new String[0]);//3stringArray = list.toArray(String[]::new);
1.2.Stream.toArray()
Метод stream.toArray() похож на метод list.toArray(), рассмотренный выше. Это также перегруженный метод.
- Object[] toArray() : возвращает массив, содержащий элементы потока, полученные из списка.
- <A> A[] toArray(IntFunction<A[]> generator) : возвращает массив, содержащий элементы потока, полученные из списка, и функцию генератора, используемую для выделения возвращаемого массива.
List<String> list = Arrays.asList("A", "B", "C");String[] stringArray = list.stream().toArray(String[]::new);
Преимущества использования потоков следующие:
- Мы можем использовать list.parallelStream(), если размер списка значительно больше для обработки в одном потоке. Параллельные потоки позволяют нам выполнять код параллельно на отдельных ядрах. Однако порядок выполнения находится вне нашего контроля, поэтому элементы в массиве не будут в том же порядке, что и в списке.
- Еще одним преимуществом является то, что мы можем применять промежуточные потоковые операции, такие как filter(), если нам нужно заполнить только выбранные элементы из списка.
Например, в данном коде мы хотим заполнить массив только элементами списка, начинающимися с символа «А».
String[] filteredArray = list.stream().filter(s -> s.equals("A")).toArray(String[]::new);
2. Преобразование массива в список
2.1 Использование Arrays.asList()
Преобразование массива в список в Java — довольно простая задача. Нам нужно использовать API Arrays.asList(). Обратите внимание, что возвращаемый список — это список фиксированного размера, поддерживаемый заданным массивом. Изменения, внесенные в массив, будут видны в возвращаемом списке, а изменения, внесенные в список, будут видны в массиве.
String[] stringArray = new String[]{"A", "B", "C"};List<String> list = Arrays.asList(stringArray);
Любой метод, вызванный в списке, который может изменить его размер, выдаст исключение UnsupportedOperationException. Тем не менее, мы можем изменять объекты, хранящиеся в списке.
//changes the list and the arraylist.set(0, "Aa");//Both array and the list are changedSystem.out.println(list); //[Aa, B, C]System.out.println(Arrays.toString(stringArray)); //[Aa, B, C]list.add("D"); //java.lang.UnsupportedOperationException
2.2 Использование Collections.unmodifiableList()
Чтобы создать неизменяемый список, нам следует использовать API Collections.unmodifiableList().
String[] stringArray = new String[]{"A", "B", "C"};List<String> list = Collections.unmodifiableList(Arrays.asList(stringArray));//Cannot change the listlist.set(0, "Aa"); //java.lang.UnsupportedOperationException
2.3 Использование итерации и потока
Чтобы создать новый изменяемый список, независимый от массива, мы можем использовать потоковый API для итерации по массиву и заполнения списка по одному элементу за раз.
String[] stringArray = new String[]{"A", "B", "C"};List<String> list = Stream.of(stringArray).collect(Collectors.toList());
Созданный список полностью отделен от массива, и оба изменяются независимо.
//changes the list but NOT the arraylist.add("D");//List has been updated but the array is unchangedSystem.out.println(list); //[A, B, C, D]System.out.println(Arrays.toString(stringArray)); //[A, B, C]
3. Заключение
В этом коротком уроке мы научились преобразовывать список(например, ArrayList) в массив с помощью методов list.toArray() и stream.toArray(). Аналогично мы научились получать список из массива с помощью метода Arrays.asList().
Есть еще несколько способов, например, использование API Apache Commons и Guava, но выполнять эту простую работу без какой-либо очевидной выгоды — излишне.