Метод ArrayList.toArray() в Java

Мне интересно, почему они разработали метод toArray в ArrayList для ввода ввода массива в Java?

    ArrayList<String> listArray = new ArrayList<String>();

    listArray.add("Germany");
    listArray.add("Holland");
    listArray.add("Sweden");

    String []strArray = new String[3];
    String[] a = (String [])listArray.toArray(strArray);

Мне кажется, что им не нужен этот ввод, потому что экземпляр самого массива ArrayList имеет достаточно деталей для преобразования данных в массив.

Мой вопрос, почему они все еще нуждаются в массиве, который нужно передать? Спасибо.

Ответ 1

Две причины, о которых я могу думать:

  • Erasure означает, что общие параметры недоступны во время выполнения, поэтому ArrayList<String> не знает, что он содержит строки, это просто тип raw ArrayList. Таким образом, все вызовы toArray() должны были бы вернуть a Object[], что не является строго правильным. Вам нужно было бы создать второй массив String[], а затем перебрать по первому, отбросив все его параметры, чтобы получить желаемый тип результата.
  • Способ определения метода означает, что вы можете передать ссылку на существующий массив и заполнить это методом. В некоторых случаях это, скорее всего, очень удобно, вместо того, чтобы возвращать новый массив и затем копировать его значения в другом месте.

Ответ 2

В вашем коде ArrayList может содержать все, кроме строк. Вы можете переписать код на:

ArrayList<String> listArray = new ArrayList<String>();

listArray.add("Germany");
listArray.add("Holland");
listArray.add("Sweden");

String []strArray = new String[3];
String[] a = listArray.toArray(strArray);

Однако в массивах Java содержится их тип содержимого (String) во время выполнения, в то время как генераторы стираются компилятором, поэтому система времени выполнения все еще не знает, что она должна создать String[] в вашем коде.

Ответ 3

Вам нужно получить типы массивов, отличные от Object[]. listArray.toArray(new String[3]) на самом деле не нуждается в приведении в String[], но он позволяет записывать в массивы для определенных типов, а не (довольно небезопасный) подход просто отличить Object[] к вашему типу.

Ответ 4

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

Прочитайте второй абзац javadoc: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html#toArray (T [])

Ответ 5

Не обязательно передавать Array в качестве аргумента toArray(), вы можете напрямую вызвать arrayList.toArray()

Как мы знаем, структура Collection с дженериками работает с концепцией Тип Erasure. Таким образом, arrayList становится списком Object, поэтому при преобразовании в массив он даст Object [], если вы не передадите какой-либо аргумент.

Ответ 6

ArrayList не имеет достаточной информации, учитывая, что сам "данные" хранится в ведрах массивов Object. Итак, если вы знаете "какие" элементы, которые у вас есть в списке массивов, вы можете добиться безопасности типа, используя этот вариант метода toArray.

Ответ 7

Поскольку массив, в который должны быть скопированы элементы, должен быть указан в JVM.

См. эту документацию