16

有没有理由

int[] myArray = new int[0];

编译?

这样的表达有什么用吗?

myArray[0] = 1;

java.lang.ArrayIndexOutOfBoundsException.

if (myArray == null) {
    System.out.println("myArray is null.");
} else {
    System.out.println("myArray is not null.");
}

myArray is not null..

所以我看不出为什么int[] myArray = new int[0]应该优先于myArray = null;.

4

7 回答 7

32

它只是为了减少空检查。

您可以对数组进行迭代,但不能对 null 进行迭代。

考虑代码:

for (Integer i: myArray) {
   System.out.println(i);
}

在空数组上它什么也不打印,在 null 上它会导致NullPointerException.

于 2012-11-18T20:54:13.550 回答
22

为什么不?

您可以获得一个包含目录中.exe文件列表的数组。并且该目录可以没有.exe文件。

在这种情况下强制使用null会使创建和处理数组的逻辑复杂化,并且无济于事。

更新:更重要的是,Java 中的数组大小是在编译时决定的。确实new int[0]可以在编译时检测到,但new int[System.currentTimeMillis % 10]不能。因此,在编译时检查 0 情况并不能确保您不会得到空数组。

于 2012-11-18T20:51:45.523 回答
12

例如:

public void getArraySum(int[] array) {
    int sum = 0;    

    for (int i = 0; i < array.length; i++)
        sum += array[i];

    return sum;
}

这将适用于空数组,但不适用于null参考。

您只需保存一个多余的null检查。这就是为什么您也可以创建一个空列表的原因。

于 2012-11-18T20:51:42.883 回答
6

是的,例如没有命令行参数的主方法执行。它为您提供了一个 0 大小的数组而不是 null。

于 2012-11-18T20:50:59.703 回答
5
 int[] myArray = new int[0];

java中的数组是常规对象。所以上面的代码说数组大小为零。这对于防止空指针异常特别有用。

Similar to this even Collections API have a way to initialize to an empty place holder.

 List<String> list = Collections.EMPTY_LIST;
于 2012-12-02T07:49:32.970 回答
4
public int[] getData()
{
    if (iGotNothinForYa)
    {
        return new int[0];
    }

    int[] data = buildUpArray();
    return data;
}

在使用这样的方法返回的数据的代码中,不必进行空值检查通常更容易。特别是在遍历数组时。

int[] data = getData();
for (int i : data) // yay! no null check!
{
    doSomethingWith(i);
}
于 2012-11-18T20:51:23.000 回答
1

An empty array can be used in thread synchronization when the goal is to use the least amount of memory for a locking object. Recall that arrays are objects, so if you wish to synchronize multiple threads on a single dummy object, the smallest object you can utilize is an empty array (possibly byte size):

byte bLock = new byte[0];
// Thread T1 synchronizes on this empty array object
synchronize(bLock) {
    // perform some task while blocking other threads
    // synchronizing on bLock
}
于 2016-07-17T01:01:57.123 回答