使用长度为0的数组?

时间:2014-01-20 10:15:12

标签: java arrays

char[] arrNew = new char[0];
System.out.println(arrNew.length);  // length = 0
arrNew[0]='c'; // ArrayIndexOutOfBoundsException .

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

5 个答案:

答案 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数组使用户能够在连续的内存分配中存储相同类型的值。数组总是一个固定长度的抽象数据结构,在需要时不能改变。它只是占据了记忆。

相关问题