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

rob*_*bin 74 java arrays

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,则会发生异常,但在这种情况下它只会做什么,这可能是合适的.

  • 当有一个函数`test()`时,调用函数`test(Object ... objects)`显式也很有用 (7认同)

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("").

  • 我不相信你的限制论点.Java(与例如C不同)已经需要检查负数.这个检查可以简单地适应0(只需将`> = 0`改为`> 0`).但你当然对其他人是正确的,所以增加这个限制是没有意义的. (2认同)
  • 不,这不是我的意见,因为在没有零大小数组的世界中,空字符串(基于char数组)根本不存在,因此不需要考虑循环中的空数组.这个迭代参数是一个非常实际的副作用.在那个世界中,一个数组至少有一个条目.(或者两个因为:为什么只需要一个项目的数组?) (2认同)

On *_*und 23

有时,返回零大小的数组比返回null要友好得多.

  • 这称为"空对象"模式. (7认同)

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)转换为数组,只有将空列表转换为空数组才有意义.


Don*_* Li 7

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

<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 实例。


Dan*_*ath 5

与C++相同,它允许在没有数据时更清晰地处理.