Стандартное место для пустого массива строк в JDK

Привет, есть стандартное место для доступа к пустым константам массива в JDK > 1.5.

Когда я хочу выполнить преобразование из коллекции строк (например, ArrayList) в массив строк, я использую свой собственный, который определен в моем собственном классе констант:

public static final String[] EMPTY_STRING_ARRAY = new String[0];

И затем в моем клиентском коде что-то вроде:

String[] retVal = myStringList.toArray(Constants.EMPTY_STRING_ARRAY);
return retVal;

Мне было интересно, является ли это "идиоматическим" способом сделать это или я что-то упустил. У меня сложилось впечатление от краткого поиска, который я сделал, что такого рода вещи распространены в коде многих людей.

Любые идеи, ответы, комментарии (кроме того, что я действительно не должен использовать массивы строк) очень ценятся,

Привет Саймон


person Simon B    schedule 22.03.2010    source источник


Ответы (2)


Я бы рекомендовал следующее улучшение кода:

String[] retval = myStringList.toArray(new String[myStringList.size()]);

Таким образом, метод toArray использует предоставленный массив соответствующего размера в качестве контейнера, а не создает новый за кулисами. Из javadoc ArrayList:

Если список помещается в указанный массив, он возвращается в нем. В противном случае выделяется новый массив с типом времени выполнения указанного массива и размером этого списка.

person Olivier Croisier    schedule 22.03.2010
comment
Я согласен с вашим ответом, но хотел бы отметить, что место создания массива является академическим, поскольку в примере из кода используется общий объект. Поэтому вызов не будет генерировать дополнительный объект (в отличие от вызова ... = list.toArray(new String[0]), который, я согласен, неэффективен). - person M. Jessup; 22.03.2010
comment
Спасибо за ваш ответ. Я немного смущен тем, почему это улучшение. Итак, вы говорите, что лучше явно написать в моем коде что-то, что эмулирует то, что происходит за кулисами в ArrayList, чем просто позволить этому происходить за кулисами, с возможностью того, что в будущих выпусках JDK это может каким-то образом ( не спрашивайте как) быть оптимизированным? Это просто потому, что я напрямую выделяю новый массив, а не позволяю ArrayList создать его с помощью какого-то отражающего механизма (который немного более эффективен в современных jvms)? Привет Саймон - person Simon B; 22.03.2010
comment
Обратите внимание, что согласно shipilev.net/blog/2016/arrays-wisdom-ancients /#_conclusion toArray(new T[0]) кажется быстрее, безопаснее и чище по контракту, и поэтому теперь он должен быть выбором по умолчанию. - person Vadzim; 13.05.2019

В JDK нигде нет таких определений массивов. Единственными двумя стандартными способами сделать это в JDK являются то, что вы перечисляете или

String ret[] = new String[myStringList.size()];
myStringList.toArray(ret);
return ret;
person M. Jessup    schedule 22.03.2010