Вопрос-ответ

Convert list to array in Java [duplicate]

Преобразовать список в массив в Java

Как я могу преобразовать List в Array в 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.

Переведено автоматически
Ответ 1

Либо:

Foo[] array = list.toArray(new Foo[0]);

или:

Foo[] array = new Foo[list.size()];
list.toArray(array); // fill the 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 inspection:


Существует два стиля преобразования коллекции в массив: либо с использованием массива заданного размера (например, c.toArray(new String[c.size()])), либо с использованием пустого массива (например, c.toArray(new String[0]).

В старых версиях Java рекомендовалось использовать массив заранее определенного размера, поскольку вызов отражения, необходимый для создания массива нужного размера, был довольно медленным. Однако после последних обновлений OpenJDK 6 этот вызов был усовершенствован, что сделало производительность версии с пустым массивом такой же, а иногда даже лучше, по сравнению с версией с предварительным размером. Также передача массива с заданным размером опасна для параллельной или синхронизированной коллекции, поскольку возможна гонка данных между вызовами size и toArray, что может привести к дополнительным нулям в конце массива, если коллекция была одновременно уменьшена во время операции.

Эта проверка позволяет придерживаться единого стиля: либо использовать пустой массив (что рекомендуется в современной Java), либо использовать массив заранее определенного размера (что может быть быстрее в старых версиях Java или JVM, не основанных на HotSpot).


Ответ 2

Альтернатива в Java 8:

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

Начиная с Java 11:

String[] strings = list.toArray(String[]::new);
Ответ 3

Я думаю, что это самый простой способ:

Foo[] array = list.toArray(new Foo[0]);
Ответ 4

Лучшее, что я придумал без 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;
}

Если у кого-нибудь есть лучший способ сделать это, пожалуйста, поделитесь :)

java arrays list arraylist