Java中的字节数组是否初始化为零?

5
在下面这行代码中,可以假定buffer被填充为零吗?
byte buffer[] = new byte[120];

5
这只需要10秒钟来测试自己... - AppX
7
比如在C语言中,这种方法有时会奏效,取决于编译器和幸运的内存分配。我不知道Java是否也是这样。 - Andreas
3
但是你不知道它是否仅适用于你的环境,还是在所有不同的环境中都具有一致性并且不会随时间改变。 - Angelo Fuchs
1
Java比C更加独立于系统,除非你在做一些疯狂的事情,否则它在所有系统上都是相同的。@AngeloNeuschitzer - Richard Tingle
4个回答

12

基于Java语言规范完整的语言律师答案:

10.3. 数组创建

数组是由数组创建表达式(§15.10)或数组初始化器(§10.6)创建的。

10.6. 数组初始化器

ArrayInitializer:

{ VariableInitializersopt ,opt }

因此,我们可以得出结论:您的表达式不是数组初始化器(它没有被括号包裹)。因此,我们转向数组创建:

15.10.1. 运行时评估数组创建表达式

...然后,如果出现单个DimExpr,则创建指定长度的一维数组,并将数组的每个元素初始化为其默认值(§4.12.5)

否则,如果出现n个DimExpr表达式,则数组创建有效地执行深度为n-1的一组嵌套循环,以创建所暗示的数组数组。

最后:

4.12.5. 变量的初始值

...对于byte类型,默认值为零,即(byte)0的值。

因此,答案是是的,任何Java实现都应该用零初始化byte数组。


11

3
这只是答案的一部分。 - user207421

8
所有对象和数组在构造时都会被初始化为零或等效值(null,false)。
默认值列在JLS 4.12.5中,因此是有保证的。

从4.12.5.变量的初始值开始

每个类变量、实例变量或数组组件在创建时都会初始化为默认值(§15.9、§15.10):

  • 对于字节类型,默认值为零,即(byte)0的值。

  • 对于短整型,默认值为零,即(short)0的值。

  • 对于整型,默认值为零,即0的值。

  • 对于长整型,默认值为零,即0L的值。

  • 对于浮点型,默认值为正零,即0.0f的值。

  • 对于双精度浮点型,默认值为正零,即0.0d的值。

  • 对于字符型,默认值为空字符,即'\u0000'的值。

  • 对于布尔型,默认值为false。

  • 对于所有引用类型(§4.3),默认值为null。


本地对象引用在构造时不会初始化为null。{Byte b; System.out.print(b);}由于b是局部变量而不是字段,因此不会编译。 - Ron
@RonE 你能详细说明一下吗?使用 byte b 是否可以解决这个问题? - Andreas
1
在我看来,局部变量不需要构造函数。局部变量没有new操作符。 ;) - Peter Lawrey
@Andreas 不,编译器会检查所有本地变量以确保在使用之前它们都有初始值。 - Peter Lawrey
@PeterLawrey 考虑 byte buffer[] = new byte[120]; int num_bytes = myInputStream.read(buffer, 0, 120);。在 num_bytes 之后的 buffer 中的字节是怎么初始化的? - Andreas
1
@Andreas 在读取之前它们已经被初始化了,即使它们不需要被初始化。请看我添加的JLS引用。 ;) - Peter Lawrey

-2

12
因为没有办法测试它是否“保证”。如果我的内存分配只是运气好呢? - Andreas
3
这不是一个答案。这里或链接中没有任何回答问题的内容。它应该发布为评论。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接