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

不像在C中,你可以dynamic增加一个数组的大小,Java中的数组是固定的长度。 为什么Java允许大小为0的数组呢?

String[] strings = new String[0]; 

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

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

从而避免需要检查。 如果所讨论的数组为null ,则会发生exception,但在这种情况下,它什么也不做,这可能是合适的。

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

是的,我们可以传递null而不是空数组和单个对象或原语而不是一个大小的matrix。

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

限制太复杂,并不是真正必要的

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

arrays模型vector

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


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

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

考虑一下(中午的答案的更详细的解释):

 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 APIdevise领域的最佳实践。

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

与C ++相同,在没有数据的情况下,它允许更清晰的处理。

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

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

可以使用零长度数组将数组的types传递给此方法。 例如:

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

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

一种情况我可以想到,一个空数组是非常有用的是在不允许null的情况下使用它而不是null。 一个可能的例子是数组的BlockingQueue。 当你想要告知读端的input结束时,你会做什么? 发送null似乎是一个明显的select,但事情是,BlockingQueue不接受空值。 你可以用“ boolean last; ”类包装你的数组,但是这样做有点矫枉过正。 发送一个空的(零大小)数组似乎是最合理的select。

只有一个说明:

你说:“不像在C中,你可以dynamic增加数组的大小,但是在C中,你不能改变数组的维数,对于C ++来说是一样的。