Как в 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

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
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 то показывает последнюю ссылку. В остальных случаях та ошибка, что выше.