为什么int [] a = new int [0];允许?

时间:2012-11-18 20:49:25

标签: java

有原因吗

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;的原因。

7 个答案:

答案 0 :(得分:27)

这只是为了减少空检查。

您可以迭代数组但不能迭代null。

考虑代码:

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

在空数组上它不打印任何内容,在null时它会导致NullPointerException

答案 1 :(得分:21)

为什么不呢?

您可以在目录中获取包含.exe文件列表的数组。该目录不能包含.exe个文件。

在这种情况下强制使用null会使创建和处理数组的逻辑变得复杂,并且没有任何帮助。

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

答案 2 :(得分:11)

例如:

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

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

    return sum;
}

这将使用空数组,但不会使用null引用。

您只需保存多余的null支票即可。这就是为什么你也可以创建一个空列表的例子。

答案 3 :(得分:6)

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

答案 4 :(得分:3)

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);
}

答案 5 :(得分:2)

 int[] myArray = new int[0];

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

与此类似,即使Collections API也可以初始化为空占位符。

 List<String> list = Collections.EMPTY_LIST;

答案 6 :(得分:1)

当目标是为锁定对象使用最少量的内存时,可以在线程同步中使用空数组。回想一下,数组是对象,所以如果你想在一个虚拟对象上同步多个线程,你可以使用的最小对象是一个空数组(可能是字节大小):

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
}