Java 为什么int[]a=新的int[0];允许?

Java 为什么int[]a=新的int[0];允许?,java,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."); } int[] myAr

有什么原因吗

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.");
}
 int[] myArray = new int[0];
给出的
myArray不为空。


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

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

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);
}
例如:

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

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

    return sum;
}
public void getArraySum(int[]数组){
整数和=0;
for(int i=0;i
这将适用于空数组,但不适用于
null
引用

您只需保存一个冗余的
null
检查。这就是为什么您还可以创建一个空列表,例如。

为什么不可以

您可以使用目录中的
.exe
文件列表获取数组。并且该目录不能有
.exe
文件

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


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

这只是为了减少空检查

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

以代码为例:

for (Integer i: myArray) {
   System.out.println(i);
}
在空数组上它不打印任何内容,在空数组上它导致
NullPointerException

if (myArray == null) {
    System.out.println("myArray is null.");
} else {
    System.out.println("myArray is not null.");
}
 int[] myArray = new int[0];
java中的数组是常规对象。所以上面的代码表示数组大小为零。这对于防止空指针异常特别有用

与此类似,即使集合API也有一种初始化为空占位符的方法

 List<String> list = Collections.EMPTY_LIST;
List List=Collections.EMPTY\u List;

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


这是一个空数组--完全合法。在看过这些示例之后,我想知道为什么我没有考虑它们。。。它们是如此明显。即使这个概念没有实际用途(而且有很多),它也应该为了统一而存在。