有原因吗
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;
的原因。
答案 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
}