Как преобразовать arraylist в массив java
Перейти к содержимому

Как преобразовать arraylist в массив java

  • автор:

Как в Java преобразовать List в массив, и наоборот

Допустим, у нас есть список, и надо его преобразовать в массив. Как это сделать? Возьмем для примера список строк:

List list = new ArrayList<>(); list.add("Petya"); list.add("Vasya");

Мы хотим преобразовать его в массив:

String[] stringArray =

Сделаем это без сторонних библиотек средствами JDK. Начнем с 11 версии, дальше покажу способы на 8 версии, и потом метод с Generics.

Способ № 1 (JDK 11)

Итак, с 11 версии список в массив можно преобразовать вот так изящно:

String[] stringArray = list.toArray(String[]::new);

Способ № 2 (JDK 8)

В 8 версии можно сделать так (внимание, в скобках параметром указываем тип массива, а иначе результирующий массив будет типа Object[]):

String[] stringArray = list.toArray(new String[0]);

Заметьте, что в аргументе можно указать массив нулевой длины, главное, что есть тип. В этом случае будет создан и вернется новый массив нужной длины. Если же список помещается, то вернется тот, что в аргументе.

Способ № 3 с использованием stream() (JDK 8)

String[] stringArray = list.stream().toArray(String[]::new);

Метод для Generics

Допустим, надо написать общий метод для любого типа данных:

private static String[] listToArray(List list)

Проверим, что он работает. Создадим класс:

class Person < private String name; public Person(String name) < this.name = name; >public String toString() < return name; >>
@Test public void m4() < Listlist=new ArrayList<>(); list.add(new Person("Petya")); list.add(new Person("Vasya")); String[] stringArray = listToArray(list); assertThat(stringArray[0], is("Petya")); assertThat(stringArray[1], is("Vasya")); >

Преобразование Array в List

Теперь допустим у нас есть массив строк:

String[] stringArray = new String[];

Массив в List преобразуется так:

List list = Arrays.asList(stringArray);

Но полученный массив — фиксированного размера, в него нельзя добавлять и удалять элементы. Менять же элементы внутри можно, при этом изменения отразятся на массиве. И наоборот.

Чтобы получить обычный List, можно создать новый List на основе предыдущего:

new ArrayList(list);

Также метод не годится для преобразования массива примитивов в список, т.к. возьмет переданный массив в качестве первого объекта.

Преобразование массива примитивов в список List

Для примитивов проще использовать метод стримов boxed():

int[] ar=; List list= Arrays.stream(ar).boxed().toList();

Преобразование List в массив примитивов

List list = .. int[] arrayOfPrimitives = list.stream().mapToInt(i -> i).toArray();

Исходный код

Код примеров доступен на GitHub (в тестах).

Автор sysout Опубликовано 31.12.2019 06.12.2023 Рубрики Core Java

Добавить комментарий Отменить ответ

Прошу прощения: на комментарии временно не отвечаю.

Как добавить массив в arraylist java

Чтобы добавить массив в ArrayList в Java , можно использовать метод addAll() из класса Collections . Для этого нужно создать ArrayList и затем вызвать метод addAll() для добавления элементов из массива в список.

String[] array = "one", "two", "three">; ArrayListString> list = new ArrayListString>(); Collections.addAll(list, array); 

Теперь список list содержит элементы массива array

Как преобразовать ArrayList в int[]?

Нужно сформировать массив из чисел, и его точный размер заранее неизвестен (зависит от входных данных, не напрямую). Поэтому применяю ArrayList. Числа — целые, натуральные. Но на выходе мне нужно получить обычный массив из int’ов (примитивный тип). Пока нашёл метод toArray у ArrayList, но не могу понять, как с помощью этого метода преобразовать объект типа ArrayList в массив числе типа int[].
Можно, конечно, воспользоваться циклом, но мне кажется, это не самое лучшее и простое решение + затратно по времени и потребляемой памяти (а на это есть некие ограничения).

  • Вопрос задан более трёх лет назад
  • 5943 просмотра

Комментировать

Решения вопроса 1

evgeniy8705

gleendo @evgeniy8705

Повелитель вселенной

public class App < public static void main(String[] args) < Listlist = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); int[] arr = new int[list.size()]; for (int i = 0; i < list.size(); i++) < arr[i] = list.get(i); >System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5, 6, 7, 8, 9] > >
List list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); Integer[] arr = list.toArray(new Integer[0]);

Ответ написан более трёх лет назад

Переделать ArrayList в обычный массив String[]

Но Eсlipse ругается на ; причем вне зависимости от того как я пытаюсь преобразовать, в этом случае тоже будет ошибка:

String[] url = <>; // ошибка url = linkList.toArray(new String[linkList.size()]); 

В этом варианте нет ошибки:

String[] url = linkList.toArray(new String[linkList.size()]); 

Но если попытаться вывести на консоль, то вместо данных я получаю вот такую ошибку:

Ljava.lang.String;@45ds364

А вот такой вариант крашит программу:

lk.setText("Ссылка: " +url[2]); 

Такой нормально покажет ссылку:

lk.setText("Ссылка: " +linkList.get(2)); 

Соответственно вопрос в чем может быть ошибка и как лучше преобразовать ArrayList в обычный массив.
Отслеживать
1,552 2 2 золотых знака 10 10 серебряных знаков 17 17 бронзовых знаков
задан 7 фев 2014 в 13:54
41 1 1 золотой знак 1 1 серебряный знак 4 4 бронзовых знака

Нижеследующий фрагмент нормально компилится. Может вы что-то недоговариваете? ArrayList linkList = new ArrayList(); String[] url = new String[linkList.size()]; url = linkList.toArray(url); > Но если попытаться вывести на консоль, то вместо данных я получаю вот такую ошибку: > > Ljava.lang.String;@45ds364 Это не ошибка, это нормальное поведение. Метод toString() у массивов не переопределен. если хотите получить строковое представление массива используйте Arrays.deepToString(myArray) > String[] url = <>; // ошибка такого синтаксиса в Java нет вовсе.

7 фев 2014 в 14:07

> А вот такой вариант крашит программу: > > lk.setText(«Ссылка: » +url[2]); Скиньте сюда сообщение об ошибке и стэктрейс, если несложно.

7 фев 2014 в 14:10

02-07 14:33:55.393: E/AndroidRuntime(377): FATAL EXCEPTION: main 02-07 14:33:55.393: E/AndroidRuntime(377): java.lang.ArrayIndexOutOfBoundsException Насколько я понимаю массив просто пуст и при попытке обратиться к несуществующими значению выскакивает ошибка, так как исключения не прописаны. Но если я прав, почему строковый массив пуст тогда как с динамическим все нормально.

7 фев 2014 в 14:44

Вообще наполнение массива идет в отдельном потоке, если преобразовывать внутри этого потока в onPostExecute то показывает последнюю ссылку. В остальных случаях та ошибка, что выше.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *