为什么Java允许大小为0的数组?
java中的数组的长度是固定的。 为什么Java允许大小为0的数组呢?
String[] strings = new String[0];
robbin asked 2019-06-13T10:30:23Z
10个解决方案
104 votes
它表示它是空的。即 你可以循环它,好像它有项目,没有结果发生:
for(int k = 0; k < strings.length; k++){
// something
}
从而避免了检查的需要。 如果有问题的数组是null,则会发生异常,但在这种情况下它只会执行任何操作,这可能是合适的。
Noon Silk answered 2019-06-13T10:30:44Z
48 votes
为什么Java允许大小为1的数组? 在数组中包装单个值是不是没用? 如果Java只允许大小为2或更大的数组,那还不够吗?
是的,我们可以传递String而不是空数组和单个对象或基元而不是size-one-matrix。
但是有一些反对这种限制的好理由。 我的个人主要论点:
限制太复杂而且不是必需的
要将数组限制为大小[1..INTEGER.MAX_INT],我们必须添加许多额外的boudary检查(同意Konrads注释)转换逻辑和方法重载到我们的代码。 从允许的阵列大小中排除0(可能是1)不会节省成本,它需要额外的工作量并对性能产生负面影响。
数组模型矢量
数组是矢量的一个很好的数据模型(数学,而不是String类!)。 当然,数学中的向量可能是零维的。 这在概念上与不存在不同。
Sidenote - (char-)数组的显着包装是String类。 不可变的String实现了一个空数组的概念:它是空字符串("")。
Andreas_D answered 2019-06-13T10:32:01Z
21 votes
有时,返回零大小的数组比返回null要友好得多。
On Freund answered 2019-06-13T10:32:27Z
11 votes
考虑一下(对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中,您可以将列表(例如ArrayList)转换为数组,只有将空列表转换为空数组才有意义。
Behrang answered 2019-06-13T10:33:14Z
5 votes
与C ++相同,它允许在没有数据时更清晰地处理。
Dan McGrath answered 2019-06-13T10:33:39Z
3 votes
零长度数组可能有用的另一种情况:要返回包含列表中所有元素的数组:
T[ ] toArray(T[ ] a)
零长度数组可用于将数组类型传递给此方法。 例如:
ClassA[ ] result = list.toArray(new ClassA[0]);
零长度数组仍然是Object的一个实例,它包含零个元素。
Don Li answered 2019-06-13T10:34:19Z
2 votes
我可以想到一个空数组非常有用的地方是在不允许null的情况下使用它而不是null。 一个可能的例子是数组的BlockingQueue。 当您想要向输入端发出输入结束信号时,您会怎么做? 发送null似乎是一个明显的选择,但问题是BlockingQueue不接受空值。 您可以使用“boolean last;”类字段将数组包装在一个类中,但这有点过分。 发送空(零大小)数组似乎是最合理的选择。
Sergei Tachenov answered 2019-06-13T10:34:46Z
2 votes
只有一张纸条:
你说:“不像在C中,你可以动态地增加数组的大小,”但是在C中你不能改变数组的维度,对于C ++也是如此。
ingconti answered 2019-06-13T10:35:18Z
0 votes
零长度数组有用的另一种情况是复制二维数组时。 我可以写:
public int[][] copyArray(int[][] array){
int[][] newArray = new int[array.length][0];
for(int i=0;i
newArray[i] = array[i];
}
return newArray;
由于数组中的每个数组引用都被覆盖,因此将它们初始化为零长度数组的引用是最有效的。
chessprogrammer answered 2019-06-13T10:35:51Z
0 votes
0长度byte[]或char[]可以表示空String,它与null不同。从字符串获取字节或字符作为数组(使用getBytes(),getChars()等getChars()等),反之亦然形成Strings 来自byte[],char[]很常见。 例如,对于自定义编码,字符串的解码。
Madhu answered 2019-06-13T10:36:20Z