为什么Java允许大小为0的数组?

时间:2011-01-06 06:40:39

标签: java arrays

java中的数组的长度是固定的。为什么Java允许大小为0的数组?

String[] strings = new String[0];

9 个答案:

答案 0 :(得分:109)

它表示它是空的。即你可以循环它,好像它有项目并且没有结果发生:

for(int k = 0; k < strings.length; k++){
   // something
}

从而避免了检查的需要。如果有问题的数组是null,则会发生异常,但在这种情况下,它只会执行任何操作,这可能是合适的。

答案 1 :(得分:48)

为什么Java允许大小为1的数组?在数组中包装单个值是不是没用?如果Java只允许大小为2或更大的数组,那还不够吗?

是的,我们可以传递null而不是空数组和单个对象或基元而不是size-one-matrix。

但是有一些好的论据反对这种限制。我个人最重要的论点:

限制太复杂而且没有必要

要将数组限制为大小[1..INTEGER.MAX_INT],我们必须添加许多额外的boudary检查, (同意Konrads评论)转换逻辑和方法重载我们的代码。从允许的阵列大小中排除0(可能是1)不会节省成本,需要额外的工作量并对性能产生负面影响。

数组模型矢量

数组是向量的一个很好的数据模型(数学, Vector类!)。当然,数学中的向量可能是零维的。这在概念上与不存在不同。


Sidenote - (char-)数组的显着包装是String类。不可变String实现了空数组的概念:它是空字符串("")。

答案 2 :(得分:23)

有时返回零大小的数组比使用null更友好。

答案 3 :(得分:12)

考虑一下(对Noon答案的更详细解释):

public String[] getStrings() {
 if( foo ) {
  return null;
 } else {
  return new String[] {"bar, "baz"};
 }
}

String[] strings = getStrings();
if (strings != null) {
 for (String s : strings) {
  blah(s);
 }
}

现在将其与此进行比较:

public String[] getStrings() {
 if( foo ) {
  return new String[0];
 } else {
  return new String[] {"bar, "baz"};
 }
}

// the if block is not necessary anymore
String[] strings = getStrings();
for (String s : strings) {
 blah(s);
}

这(返回空数组而不是空值)实际上是Java API设计世界中的最佳实践。

此外,在Java中,您可以将Lists(例如ArrayList)转换为数组,只有将空列表转换为空数组才有意义。

答案 4 :(得分:5)

与C ++相同,它允许在没有数据时更清晰地处理。

答案 5 :(得分:3)

零长度数组有用的另一种情况: 要返回包含列表中所有元素的数组:

<T> T[ ] toArray(T[ ] a)

零长度数组可用于将数组类型传递给此方法。例如:

ClassA[ ] result = list.toArray(new ClassA[0]);

零长度数组仍然是Object的一个实例,它保存零元素。

答案 6 :(得分:2)

我可以想到一个空数组非常有用的地方是在不允许null的情况下使用它而不是null。一个可能的例子是数组的BlockingQueue。当您想要向输入端发出输入结束信号时,您会怎么做?发送null似乎是一个明显的选择,但问题是BlockingQueue不接受空值。你可以将你的数组包装在一个具有“boolean last;”类字段的类中,但这有点过分。发送空(零大小)数组似乎是最合理的选择。

答案 7 :(得分:0)

零长度数组有用的另一种情况是复制二维数组时。我可以写:

public int[][] copyArray(int[][] array){
     int[][] newArray = new int[array.length][0];
     for(int i=0;i<array.length;i++){
         newArray[i] = array[i];
     }
     return newArray;

由于数组中的每个数组引用都被覆盖,因此将它们初始化为引用零长度数组是最有效的。

答案 8 :(得分:0)

长度为0的byte[]char[]可以代表一个空的String,这与null不同。从字符串中获取字节或字符作为数组(使用getBytes()类的getChars()String等),反之亦然,从{{ 1}},String很常见。例如,对于自定义编码,对字符串进行解码。