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

为什么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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值