Comment puis-je initialiser un tableau de chaînes de longueur 0 en Java?


133

La documentation Java de la méthode
String[] java.io.File.list(FilenameFilter filter)
inclut ceci dans la description des retours:

Le tableau sera vide si le répertoire est vide ou si aucun nom n'a été accepté par le filtre.

Comment faire une chose similaire et initialiser un tableau String (ou tout autre tableau d'ailleurs) pour avoir une longueur 0?


7
Je viens de réaliser que c'est une question stupide: (Comme ces tableaux sont initialisés exactement de la même manière que tout autre tableau juste avec une taille 0. Montre à quelle fréquence j'initialise les tableaux de nos jours. Je laisserai la question (ne la supprimera pas) un jour quelqu'un d'autre pourrait être aussi stupide que je l'étais tout à l'heure :)
Ron Tuffin

1
Je ne sais pas quel cas d'utilisation vous auriez pour un tableau de longueur 0, et pourquoi vous ne voudriez pas simplement commencer nulldans ce cas particulier.
Blake

Réponses:


230

Comme d'autres l'ont dit,

new String[0]

créera en effet un tableau vide. Cependant, il y a une bonne chose à propos des tableaux: leur taille ne peut pas changer, vous pouvez donc toujours utiliser la même référence de tableau vide. Donc, dans votre code, vous pouvez utiliser:

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

puis revenez simplement EMPTY_ARRAYchaque fois que vous en avez besoin - il n'est pas nécessaire de créer un nouvel objet à chaque fois.


7
Il semble que tout le monde aime taper:private static final String[] EMPTY_ARRAY = {};
Thomas Jung

8
@Thomas: Je comprends votre point de vue, mais pour ce cas particulier, je préfère la forme la plus explicite. Il est plus clair pour moi que cela signifie "Je veux un tableau de chaînes avec 0 élément" plutôt que "Je veux un tableau avec ce contenu - qui est vide". Juste une préférence personnelle, je suppose.
Jon Skeet

1
@Tony - Je dois utiliser les quelques endroits où Java peut déduire un type. :-)
Thomas Jung

1
@delive: L'exemple que j'ai fourni créera toujours un tableau vide, mais comme il est vide, vous ne pouvez pas l'utiliser EMPTY_ARRAY[0]- c'est essayer d'accéder à l'élément 0, qui n'existe pas ...
Jon Skeet

1
@theyuv: En fin de compte, cela n'aura pas d'importance. Si vous n'en avez besoin qu'à un seul endroit, déclarez-le dans cette classe. Si vous trouvez que vous en avez besoin à plus d'endroits, vous pouvez toujours le déplacer vers une classe «utilitaire».
Jon Skeet


18
String[] str = {};

Mais

return {};

ne fonctionnera pas car les informations de type sont manquantes.


10
return new String[] { };et return new String[0];fonctionneraient tous les deux.
Bombe

13

Ok, j'ai trouvé la réponse mais j'ai pensé que j'allais `` importer '' la question dans SO de toute façon

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


Ajoutez un tel commentaire à votre question ... ou sélectionnez l'une des réponses qui disent la même chose.
Jonathan Leffler

6
Merci pour le commentaire Jonathan. Comme vous l'avez peut-être remarqué, j'ai posté cette réponse avant tout le monde (et en tant que telle, il n'y avait aucune réponse à sélectionner). Je ne vois pas non plus comment l'ajout de la réponse à la question fait une meilleure question.
Ron Tuffin

2

Vous pouvez utiliser ArrayUtils.EMPTY_STRING_ARRAY à partir de 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

Créez une fonction qui ne retournera pas null à la place renvoyer un tableau vide que vous pouvez parcourir le code ci-dessous pour comprendre.

    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;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.