java中的数组的长度是固定的.为什么Java允许大小为0的数组呢?
String[] strings = new String[0];
Run Code Online (Sandbox Code Playgroud)
Noo*_*ilk 114
它表示它是空的.即你可以循环它,好像它有项目,没有结果发生:
for(int k = 0; k < strings.length; k++){
// something
}
Run Code Online (Sandbox Code Playgroud)
从而避免了检查的需要.如果有问题的数组是null,则会发生异常,但在这种情况下它只会做什么,这可能是合适的.
And*_*s_D 48
为什么Java允许大小为1的数组?在数组中包装单个值是不是没用?如果Java只允许大小为2或更大的数组,那还不够吗?
是的,我们可以传递null而不是空数组和单个对象或基元而不是size-one-matrix.
但是有一些反对这种限制的好理由.我的个人主要论点:
限制太复杂而且不是必需的
要将数组限制为大小[1..INTEGER.MAX_INT],我们必须添加许多额外的boudary检查(同意Konrads注释)转换逻辑和方法重载到我们的代码.从允许的阵列大小中排除0(可能是1)不会节省成本,它需要额外的努力并对性能产生负面影响.
数组模型矢量
阵列为矢量良好的数据模型(数学,不将Vector类!).当然,数学中的向量可能是零维的.这在概念上与不存在不同.
Sidenote - 一个(char-)数组的显着包装器就是这个String类.immutable String实现了一个空数组的概念:它是空的String("").
Lam*_*bda 13
考虑一下(对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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在将它与此进行比较:
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);
}
Run Code Online (Sandbox Code Playgroud)
这(返回空数组而不是空值)实际上是Java API设计世界中的最佳实践.
此外,在Java中,您可以将列表(例如ArrayList)转换为数组,只有将空列表转换为空数组才有意义.
零长度数组有用的另一种情况:返回包含列表中所有元素的数组:
<T> T[ ] toArray(T[ ] a)
Run Code Online (Sandbox Code Playgroud)
可以使用零长度数组将数组的类型传递到此方法中。例如:
ClassA[ ] result = list.toArray(new ClassA[0]);
Run Code Online (Sandbox Code Playgroud)
零长度数组仍然是包含零个元素的 Object 实例。
| 归档时间: |
|
| 查看次数: |
70015 次 |
| 最近记录: |