如何在Java中初始化长度为0的String数组?


133

该方法的Java文档
String[] java.io.File.list(FilenameFilter filter)
包含在返回说明中:

如果目录为空或过滤器未接受任何名称,则该数组为空。

我如何做类似的事情,并将String数组(或与此相关的任何其他数组)初始化为长度为0?


7
我刚刚意识到这是一个愚蠢的问题:(由于这些数组的初始化方式与其他大小为0的其他数组完全相同。显示了当今我初始化数组的频率。我将把问题(而不是删除它)放在某天别人可能和我现在一样愚蠢:)
罗恩·塔芬

1
我对于长度为0的数组将具有哪种用例感到困惑,为什么null在这种特殊情况下不能简单地将其初始化。
布莱克

Answers:


230

正如其他人所说,

new String[0]

确实会创建一个空数组。但是,关于数组有一件好事-数组的大小不能改变,因此您始终可以使用相同的空数组引用。因此,在您的代码中,您可以使用:

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

然后EMPTY_ARRAY每次需要时就返回-无需每次都创建一个新对象。


7
似乎每个人都喜欢打字:private static final String[] EMPTY_ARRAY = {};
Thomas Jung

8
@Thomas:我同意你的观点,但是对于这种特殊情况,我更喜欢更明确的形式。对我来说,这很清楚,它的意思是“我想要一个包含0个元素的字符串数组”,而不是“我想要一个具有此内容的数组-它为空”。我猜只是个人喜好。
乔恩·斯基特

1
@Tony-我必须使用Java可以推断类型的几个地方。:-)
Thomas Jung

1
@delive:我提供的示例仍然会创建一个空数组,但是由于它为空,因此您无法使用EMPTY_ARRAY[0]-试图访问不存在的元素0 ...
Jon Skeet 2015年

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

您可以从org.apache.commons.lang3使用ArrayUtils.EMPTY_STRING_ARRAY

import org.apache.commons.lang3.ArrayUtils;

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

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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.