char[] arrNew = new char[0];
System.out.println(arrNew.length); // length = 0
arrNew[0]='c'; // ArrayIndexOutOfBoundsException .
在上面的代码中你可以清楚地看到,有一个大小为0的数组是没有意义的。据我所知,没有0大小数组的实际用法。有人可以解释为什么编译器允许创建0长度数组。还有一个0长度数组与初始化为null的数组有何不同? (即,分配给它的内存就好像它是一个正常的数组?)。如果这个问题看起来很愚蠢,我很抱歉。
答案 0 :(得分:6)
我们可以从方法返回一个空数组而不是null,这称为Null对象设计模式。请考虑以下代码
Person[] res = find(name);
for(String e : res) {
System.out.println(e);
}
如果find()找不到任何人,则返回一个空数组。如果find返回null,则代码需要将其视为特殊情况。
我们应该记住,空数组是不可变的,因此使用单例而不是每次创建它都是合乎逻辑的
private static final Person[] NULL = new Person[0];
Person[] find(String name) {
...
if (notFound) {
return NULL;
}
...
答案 1 :(得分:4)
最好不要从返回数组类型的方法返回null。即使数组长度为零,也总是返回一个数组,这大大提高了算法的通用性。如果您预计您的方法将频繁返回零长度数组,您可能会担心分配许多此类数组的性能影响。要解决该问题,只需分配一个数组,并始终返回相同的数组,例如:
private static final int ZERO_LENGTH_ARRAY[] = new int[0];
此数组是不可变的(无法更改),并且可以在整个应用程序中共享。
因此在Null Object模式中,null对象替换了NULL对象实例的检查。 Null Object反映了无关系,而不是检查是否为空值。在数据不可用的情况下,此类Null对象也可用于提供默认行为。
答案 2 :(得分:1)
编译器允许,因为该代码在语言规则范围内。
不,他们都不一样。如果相同,则会得到NullPointerException
而不是ArrayIndexOutOfBoundsException
。
答案 3 :(得分:1)
它可以是有用的,如果你有一个函数返回对数组的引用,如果你没有什么可以返回,那么你可能会认为最好返回0长度数组而不是null。如果返回null,则必须检查此函数是否为空值,如果范围正确,如果返回0长度数组 - 那么您可能只检查if范围是否正确 - 即。在for循环中。
答案 4 :(得分:1)
零长度数组很少“需要”,但更常用于表明没有数据传递给方法。
在java中,内存分配本质上可以是动态的。 java数组使用户能够在连续的内存分配中存储相同类型的值。数组总是一个固定长度的抽象数据结构,在需要时不能改变。它只是占据了记忆。