Метод 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.
См. эту документацию