Преобразование списка в массив в Java
Проблема с преобразованием List в массив в Java
Здравствуйте!
Я пытаюсь преобразовать объект типа List
в массив в Java, но сталкиваюсь с некоторыми трудностями. Мой код выглядит следующим образом:
ArrayList<Tienda> tiendas;
List<Tienda> tiendasList;
tiendas = new ArrayList<Tienda>();
Resources res = this.getBaseContext().getResources();
XMLParser saxparser = new XMLParser(marca,res);
tiendasList = saxparser.parse(marca,res);
tiendas = tiendasList.toArray();
this.adaptador = new adaptadorMarca(this, R.layout.filamarca, tiendas);
setListAdapter(this.adaptador);
В частности, мне нужно заполнить массив tiendas
значениями из tiendasList
. Однако, когда я использую метод toArray()
, возникает проблема — массив tiendas
не заполняется данными корректно.
Как правильно преобразовать List
в массив и устранить возникшую проблему? Заранее спасибо за помощь!
5 ответ(ов)
Для преобразования списка в массив в Java вы можете воспользоваться одним из двух подходов:
- Использовать пустой массив:
Foo[] array = list.toArray(new Foo[0]);
- Или инициализировать массив заранее:
Foo[] array = new Foo[list.size()];
list.toArray(array); // заполнение массива
Обратите внимание, что данный подход работает только для массивов ссылочных типов. Для массивов примитивных типов рекомендуется использовать традиционный способ:
List<Integer> list = ...;
int[] array = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = list.get(i);
}
Обновление:
Сейчас рекомендуется использовать list.toArray(new Foo[0]);
, а не list.toArray(new Foo[list.size()]);
.
Согласно инспекции от JetBrains IntelliJ IDEA:
Существуют два стиля для преобразования коллекции в массив: либо использовать заранее определённый массив (например, c.toArray(new String[c.size()])), либо использовать пустой массив (например, c.toArray(new String[0])).
В старых версиях Java рекомендовалось использовать заранее определённый массив, так как вызов рефлексии для создания массива нужного размера был довольно медленным. Однако начиная с последних обновлений OpenJDK 6 этот вызов был оптимизирован, что делает производительность версии с пустым массивом такой же, а иногда даже лучше, по сравнению с версией с заранее определённым массивом. Также передача заранее определённого массива может быть опасна для конкурентных или синхронизированных коллекций, так как возможна гонка данных между вызовами size и toArray, что может привести к наличию лишних null в конце массива, если коллекция была одновременно уменьшена во время операции.
Эта инспекция позволяет следовать единообразному стилю: либо использовать пустой массив (что рекомендуется в современной Java), либо использовать заранее определённый массив (что может быть быстрее в старых версиях Java или в не-HotSpot JVM).
В Java 8 вы можете преобразовать список в массив строк с помощью стрима, как показано ниже:
String[] strings = list.stream().toArray(String[]::new);
Начиная с Java 11, вы можете упростить этот процесс, используя метод toArray()
непосредственно на списке:
String[] strings = list.toArray(String[]::new);
Это более лаконичный и прямой способ получения массива из списка.
Я думаю, что это самый простой способ:
Foo[] array = list.toArray(new Foo[0]);
Этот подход позволяет создать массив нужного типа и заполнить его элементами из списка. Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать!
Лучшее, что я придумал без использования Java 8:
public static <T> T[] toArray(List<T> list, Class<T> objectClass) {
if (list == null) {
return null;
}
T[] listAsArray = (T[]) Array.newInstance(objectClass, list.size());
list.toArray(listAsArray);
return listAsArray;
}
Если у кого-то есть более элегантное решение для этой задачи, буду признателен, если поделитесь! 😃
Я наткнулся на этот фрагмент кода, который решает эту задачу.
//Создание примерного ArrayList
List<Long> list = new ArrayList<Long>();
//Добавление значений типа long
list.add(100L);
list.add(200L);
list.add(300L);
//Преобразование ArrayList в массив Long
Long[] array = list.toArray(new Long[0]);
//Вывод результатов на экран
System.out.println(array[0] + " " + array[1] + " " + array[2]);
Преобразование выполняется следующим образом:
- Создается новый массив типа Long, заполненный значениями из исходного списка.
- Метод
toArray
преобразует оригинальный ArrayList в массив, используя указанный ранее массив. - В данном случае нет необходимости в явном приведении, так как метод
toArray
возвращает массив нужного типа (Long[]), который я соответственно назвалarray
.
Такой подход может помочь избежать ошибок, связанных с приведением типов. Обратите внимание, что я использовал new Long[0]
в методе toArray
, так как это иногда предпочтительнее, чем передавать массив нужного размера.
Преобразование 'ArrayList<String>' в 'String[]' в Java
Инициализация ArrayList в одну строчку
Как создать обобщённый массив в Java?
Java: как преобразовать массив байтов в строку шестнадцатеричного формата?
Как объявить массив в одну строку?