Jak mogę zainicjować tablicę String o długości 0 w Javie?


134

Dokumentacja Java dla metody
String[] java.io.File.list(FilenameFilter filter)
zawiera to w opisie zwrotów:

Tablica będzie pusta, jeśli katalog jest pusty lub jeśli żadne nazwy nie zostały zaakceptowane przez filtr.

Jak zrobić coś podobnego i zainicjować tablicę String (lub inną tablicę w tym zakresie), aby miała długość 0?


7
Właśnie zdałem sobie sprawę, że to głupie pytanie :( Ponieważ te tablice są inicjowane dokładnie w taki sam sposób, jak każda inna tablica tylko o rozmiarze 0. Pokazuje, jak często inicjuję obecnie tablice. Zostawię pytanie (nie usunę go), ponieważ pewnego dnia ktoś inny może być tak samo głupi jak ja przed
chwilą

1
Nie wiem, jaki przypadek użycia miałbyś dla tablicy o długości 0 i dlaczego po prostu byś nie zainicjował nullw tym szczególnym przypadku.
Blake,

Odpowiedzi:


232

Jak powiedzieli inni,

new String[0]

rzeczywiście utworzy pustą tablicę. Jest jednak jedna fajna rzecz dotycząca tablic - ich rozmiar nie może się zmienić, więc zawsze możesz użyć tego samego odwołania do pustej tablicy. Więc w swoim kodzie możesz użyć:

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

a potem po prostu wracaj za EMPTY_ARRAYkażdym razem, gdy tego potrzebujesz - nie ma potrzeby tworzenia nowego obiektu za każdym razem.


7
Wygląda na to, że każdy lubi pisać:private static final String[] EMPTY_ARRAY = {};
Thomas Jung

8
@ Thomas: Rozumiem, ale w tym konkretnym przypadku wolę bardziej wyraźną formę. Jest dla mnie bardziej zrozumiałe, że oznacza to „Chcę mieć tablicę ciągów z 0 elementami” zamiast „Chcę mieć tablicę z taką zawartością - która jest pusta”. Myślę, że to tylko osobiste preferencje.
Jon Skeet

1
@Tony - muszę skorzystać z kilku miejsc, w których Java może wywnioskować typ. :-)
Thomas Jung

1
@delive: Przykład, który podałem, nadal tworzy pustą tablicę, ale ponieważ jest pusta, nie możesz jej użyć EMPTY_ARRAY[0]- to próba uzyskania dostępu do elementu 0, który nie istnieje ...
Jon Skeet

1
@theyuv: Ostatecznie to nie będzie miało znaczenia. Jeśli potrzebujesz go tylko w jednym miejscu, zadeklaruj to w tej klasie. Jeśli okaże się, że potrzebujesz go w większej liczbie miejsc, zawsze możesz przenieść go do klasy „użytkowej”.
Jon Skeet


18
String[] str = {};

Ale

return {};

nie będzie działać, ponieważ brakuje informacji o typie.


10
return new String[] { };i return new String[0];oba będą działać.
Bombe

13

Ok, faktycznie znalazłem odpowiedź, ale pomyślałem, że i tak „zaimportuję” pytanie do SO

String[] files = new String[0];
lub
int[] files = new int[0];


Dodaj taki komentarz do swojego pytania ... lub wybierz jedną z odpowiedzi, które mówiły to samo.
Jonathan Leffler

6
Dzięki za komentarz Jonathan. Jak pewnie zauważyłeś, opublikowałem tę odpowiedź wcześniej niż ktokolwiek inny (w związku z czym nie było odpowiedzi do wyboru). Nie rozumiem też, w jaki sposób dodanie odpowiedzi na pytanie poprawia pytanie.
Ron Tuffin,

2

Możesz użyć ArrayUtils.EMPTY_STRING_ARRAY z org.apache.commons.lang3

import org.apache.commons.lang3.ArrayUtils;

    class Scratch {
        public static void main(String[] args) {
            String[] strings = ArrayUtils.EMPTY_STRING_ARRAY;
        }
    }

0

Stwórz funkcję, która nie zwróci wartości null, zamiast tego zwróci pustą tablicę, którą możesz przeczytać poniższy kod, aby ją zrozumieć.

    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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.