Как я могу инициализировать массив строк с длиной 0 в Java?

133

Документация Java для метода
String[] java.io.File.list(FilenameFilter filter)
включает это в описание возврата:

Массив будет пустым, если каталог пуст или если никакие имена не были приняты фильтром.

Как мне сделать то же самое и инициализировать массив String (или любой другой массив в этом отношении), чтобы он имел длину 0?

Рон Туффин
источник
7
Я только что понял, что это глупый вопрос :( Поскольку эти массивы инициализируются точно так же, как и любой другой массив, только с размером 0. Показывает, как часто я инициализирую массивы в настоящее время. Я оставлю этот вопрос (не удаляю его), потому что когда-нибудь кто-то другой может быть таким же глупым, как я сейчас :)
Рон Таффин
1
Я не понимаю, какой вариант использования у вас будет для массива длиной 0, и почему вы просто не инициализируете его nullв этом особом случае.
Blake

Ответы:

230

Как говорили другие,

new String[0]

действительно создаст пустой массив. Однако в массивах есть одна приятная вещь - их размер не может измениться, поэтому вы всегда можете использовать одну и ту же ссылку на пустой массив. Итак, в вашем коде вы можете использовать:

private static final String[] EMPTY_ARRAY = new String[0];

а затем просто возвращайтесь EMPTY_ARRAYкаждый раз, когда он вам нужен - нет необходимости каждый раз создавать новый объект.

Джон Скит
источник
7
Кажется, всем нравится печатать:private static final String[] EMPTY_ARRAY = {};
Томас Юнг
8
@Thomas: Я понимаю вашу точку зрения, но в этом конкретном случае я предпочитаю более явную форму. Мне более ясно, что это означает «Я хочу массив строк с 0 элементами», а не «Я хочу массив с этим содержимым - который пуст». Просто личные предпочтения, наверное.
Джон Скит
1
@Tony - мне нужно использовать несколько мест, где Java может вывести тип. :-)
Thomas Jung
1
@delive: В приведенном мной примере будет по-прежнему создан пустой массив, но, поскольку он пуст, вы не можете его использовать EMPTY_ARRAY[0]- это пытается получить доступ к элементу 0, которого не существует ...
Джон Скит,
1
@theyuv: В конце концов, это не имеет значения. Если он вам нужен только в одном месте, объявите его в этом классе. Если вы обнаружите, что он вам нужен в большем количестве мест, вы всегда можете переместить его в «служебный» класс.
Джон Скит
18
String[] str = {};

Но

return {};

не будет работать, так как информация о типе отсутствует.

Томас Юнг
источник
10
return new String[] { };и return new String[0];оба будут работать.
Bombe
13

Хорошо, я на самом деле нашел ответ, но подумал, что все равно «импортирую» вопрос в SO

String[] files = new String[0];
или
int[] files = new int[0];

Рон Туффин
источник
Добавьте такой комментарий к своему вопросу ... или выберите один из ответов, который сказал то же самое.
Джонатан Леффлер
6
Спасибо за комментарий, Джонатан. Как вы могли заметить, я опубликовал этот ответ раньше всех (и поэтому ответов для выбора не было). Я также не понимаю, как добавление ответа на вопрос делает вопрос лучше.
Рон Таффин
2

Вы можете использовать ArrayUtils.EMPTY_STRING_ARRAY из org.apache.commons.lang3

import org.apache.commons.lang3.ArrayUtils;

    class Scratch {
        public static void main(String[] args) {
            String[] strings = ArrayUtils.EMPTY_STRING_ARRAY;
        }
    }
freak0
источник
0

Создайте функцию, которая не будет возвращать null, а вместо этого вернет пустой массив, который вы можете понять, прочитав приведенный ниже код.

    public static String[] getJavaFileNameList(File inputDir) {
    String[] files = inputDir.list(new FilenameFilter() {
        @Override
        public boolean accept(File current, String name) {
            return new File(current, name).isFile() && (name.endsWith("java"));
        }
    });

    return files == null ? new String[0] : files;
}
Свапнил Ганград
источник