为什么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 ++来说是一样的。