java中的数组的长度是固定的。为什么Java允许大小为0的数组?
String[] strings = new String[0];
答案 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
很常见。例如,对于自定义编码,对字符串进行解码。