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

Convert ArrayList to String[] array [duplicate]

Преобразовать ArrayList в String[] массив

Я работаю в среде Android и попробовал следующий код, но, похоже, он не работает.

String [] stockArr = (String[]) stock_list.toArray();

Если я определю следующим образом:

String [] stockArr = {"hello", "world"};

это работает. Я чего-то не понимаю?

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

Используйте следующим образом.

List<String> stockList = new ArrayList<String>();
stockList.add("stock1");
stockList.add("stock2");

String[] stockArr = new String[stockList.size()];
stockArr = stockList.toArray(stockArr);

for(String s : stockArr)
System.out.println(s);
Ответ 2

Попробуйте это

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

Происходит то, что stock_list.toArray() создается Object[], а не a String[] и, следовательно, типизация завершается ошибкой1.

Правильный код будет:

  String [] stockArr = stockList.toArray(new String[stockList.size()]);

или даже

  String [] stockArr = stockList.toArray(new String[0]);

Для получения более подробной информации обратитесь к javadocs для двух перегрузок List.toArray.

Последняя версия использует массив нулевой длины для определения типа результирующего массива. (Удивительно, но сделать это быстрее, чем предварительно выделить ... по крайней мере, для последних версий Java. Подробнее см. https://javalang.ru/a/4042464/139985.)

С технической точки зрения причина такого поведения / дизайна API заключается в том, что реализация List<T>.toArray() метода не имеет информации о том, что такое <T> во время выполнения. Все, что известно, это то, что тип необработанного элемента равен Object. Напротив, в другом случае параметр array указывает базовый тип массива. (Если предоставленный массив достаточно велик, чтобы вместить элементы списка, он используется. В противном случае выделяется новый массив того же типа и большего размера, который возвращается в качестве результата.)


1 - В Java Object[] присваивание несовместимо с a String[]. Если бы это было так, то вы могли бы сделать это:

    Object[] objects = new Object[]{new Cat("fluffy")};
Dog[] dogs = (Dog[]) objects;
Dog d = dogs[0]; // Huh???

Это явная бессмыслица, и именно поэтому типы массивов обычно не совместимы с назначением.

Ответ 4

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

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