From habr:
С конвертацией коллекций в массивы у Java была непростая история. С момента появления
Collection
в Java 1.2 было два способа создания массива на основе коллекции:
- Использовать метод
[Collection.toArray()](https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/Collection.html#toArray())
, который возвращаетObject[]
. - Использовать метод
Collection.toArray(Object[])
, который принимает уже созданный массив и заполняет его. Если переданный массив недостаточной длины, то создаётся новый массив нужной длины того же типа и возвращается. С появлением дженериков в Java 1.5 метод логичным образом поменял свою сигнатуру на[Collection.toArray(T[])](https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/Collection.html#toArray(T%5B%5D))
.
Загвоздка в том, что если нужен массив конкретного типа (допустим String[]
), второй метод можно использовать двумя способами:
- Использовать конструкцию
collection.toArray(new String[0])
. Тем самым, мы сознательно почти всегда отбрасываем массив, а передаём его туда, чтобы метод узнал тип массива. - Использовать конструкцию
collection.toArray(new String[collection.size()])
. В этом случае массив передаётся нужной длины, а значит ничего зря не отбрасывается, и код по идее работает быстрее. К тому же здесь не нужен рефлективный вызов.
Таким образом, второй вариант долгое время считался основным, и в IntelliJ IDEA даже была инспекция, которая подсвечивала первый вариант и предлагала конвертировать его во второй, более эффективный.
Однако в 2016 году вышла статья Алексея Шипилёва, где он решил досконально разобраться в этом вопросе и пришёл к выводу, что не-а: первый вариант всё-таки быстрее (по крайней мере в версиях JDK 6+). Эта статья получила большой резонанс, и в IDEA решили изменить инспекцию, сделав у неё три опции: предпочитать пустой массив (default), предпочитать преаллоцированный массив или предпочитать то или иное в зависимости от версии Java.
tags: