Java 使用长度为0的数组?

Java 使用长度为0的数组?,java,arrays,Java,Arrays,在上面的代码中,您可以清楚地看到,大小为0的数组没有任何意义。据我所知,0大小数组没有实际用途。有人能解释为什么编译器允许创建长度为0的数组吗。长度为0的数组与初始化为null的数组有何不同?(即,是否将内存分配给它,就好像它是一个普通数组一样?)。如果这个问题看起来很愚蠢,我很抱歉。编译器允许,因为代码在语言规则范围内 不,它们都不一样。如果是相同的,您将得到一个NullPointerException而不是ArrayIndexOutOfBoundsException我们可以从方法返回一个空数

在上面的代码中,您可以清楚地看到,大小为0的数组没有任何意义。据我所知,0大小数组没有实际用途。有人能解释为什么编译器允许创建长度为0的数组吗。长度为0的数组与初始化为null的数组有何不同?(即,是否将内存分配给它,就好像它是一个普通数组一样?)。如果这个问题看起来很愚蠢,我很抱歉。

编译器允许,因为代码在语言规则范围内


不,它们都不一样。如果是相同的,您将得到一个
NullPointerException
而不是
ArrayIndexOutOfBoundsException

我们可以从方法返回一个空数组而不是null,这称为null对象设计模式。考虑下面的代码

char[] arrNew = new char[0];
System.out.println(arrNew.length);  // length = 0
arrNew[0]='c'; // ArrayIndexOutOfBoundsException .
如果find()找不到任何人,它将返回一个空数组。若find返回null,那个么代码需要将其视为特例

我们应该记住空数组是不可变的,所以每次使用单例而不是创建它是合乎逻辑的

    Person[] res = find(name);
    for(String e : res) {
        System.out.println(e);
    }

这是有用的,如果你有一个返回数组引用的函数,如果你没有返回的东西,那么你可以认为返回0长度数组比NULL更好。如果返回null,则必须检查此函数的null值,如果范围正确,如果返回长度为0的数组,则可能只检查If范围是否正确,即for循环。

最好不要从返回数组类型的方法返回null。始终返回数组,即使数组长度为零,也可以极大地提高算法的通用性。如果您预期您的方法将经常返回零长度数组,那么您可能会担心分配许多这样的数组对性能的影响。要解决该问题,只需分配一个数组,并始终返回相同的数组,例如:

private static final Person[] NULL = new Person[0];

Person[] find(String name) {
     ...
     if (notFound) {
           return NULL;
     }
     ...
此数组是不可变的(不能更改),可以在整个应用程序中共享


所以在空对象模式中,空对象代替了对空对象实例的检查。null对象反映了一种不做任何事情的关系,而不是对null值进行if检查。这种空对象还可以用于在数据不可用的情况下提供默认行为。

零长度数组很少是“必需的”,但更常用于表示没有数据传递给方法


在java中,内存分配本质上是动态的。java数组允许用户在连续内存分配中存储相同类型的值。数组总是一种固定长度的抽象数据结构,在需要时不能更改。它只会占用内存。

看看你。。我知道,但是内存分配给它了吗??。。如果是,那么分配它有什么意义?(我们将无法在其中存储任何内容。)
null
引用无处可指
0
length数组有一个指向的位置,并且可以在不运行
NullPointerException
的情况下取消引用。见@EvgeniyDorofeev对其“为什么”的解释。。但内存是否会分配给长度为0的数组?@当然是allocated@Aniket-首先,为什么??。。。没有一个单元格可指向,因此将分配多少?@thelost注意数组是
对象的子类
?您认为为一个
新对象()
分配了多少?一个数组有一个抽象的结构,它以单元数的形式存储元数据。将为此分配内存,但只是单元数(
length
技术上)将为0+1如果您提到“空对象设计模式”,您可能会获得更多的投票。SO社区显然认为编写“设计模式”的能力使你成为软件开发的半神之一:)@MarkoTopolnik谢谢你的建议。。
private static final int ZERO_LENGTH_ARRAY[] = new int[0];