【问题标题】:Are byte arrays initialised to zero in Java?Java中的字节数组是否初始化为零?
【发布时间】:2013-10-06 07:46:58
【问题描述】:

在下面的行中,可以假设buffer 被零填充吗?

byte buffer[] = new byte[120];

【问题讨论】:

  • 测试自己只需 10 秒...
  • @AppX 例如,在 C 中,这有时会起作用,具体取决于编译器和幸运的内存分配。我不知道Java是否也一样。
  • @AppX 但是你不知道它是只适用于你的环境还是在所有不同的环境中都是一致的并且不会随着时间而改变。
  • Java 比 C 更独立于系统,除非你在做一些疯狂的事情,否则它在所有系统上都是一样的。抄送@AngeloNeuschitzer

标签: java


【解决方案1】:

【讨论】:

  • 这只是部分答案。
【解决方案2】:

所有对象和数组在构造时都用零或等效(null,false)初始化。

默认值在JLS 4.12.5 中列出,因此得到保证。


从 4.12.5 开始。变量初始值

每个类变量、实例变量或数组组件在创建时都会使用默认值进行初始化(第 15.9 节、第 15.10 节):

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

  • 对于short类型,默认值为0,即 (短)0.

  • 对于int类型,默认值为0,即0。

  • 对于long类型,默认值为0,即0L。

  • 对于float类型,默认值为正零,即0.0f。

  • 对于double类型,默认值为正零,即0.0d。

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

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

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

【讨论】:

  • 本地对象引用在构造时未初始化为 null。 {字节 b; System.out.print(b);} 不会编译,因为 b 是局部变量而不是字段
  • @RonE 你能扩展一下吗?使用byte b 会解决这个问题吗?
  • 恕我直言,未构造局部变量。局部变量没有new。 ;)
  • @Andreas 不,编译器会检查所有局部变量以确保它们在使用前具有初始值。
  • @Andreas 它们在读取之前已被初始化,即使它们不需要。请参阅我添加的 JLS 的引用。 ;)
【解决方案3】:

你为什么不试试这个。

       byte buffer[] = new byte[120];
        for (int i = 0; i < buffer.length; i++)
        {
            System.out.println(buffer[i]);
        }    

请查找参考

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

【讨论】:

  • 因为没有办法测试它是否保证。如果我只是幸运地分配了内存怎么办?
  • 这不是答案。这里或链接中没有任何内容可以回答问题。它应该作为评论发布。
【解决方案4】:

Language-lawyer-answer 完全基于 Java 语言规范:

10.3. Array Creation

数组由数组创建表达式(第 15.10 节)或数组初始化程序(第 10.6 节)创建。

10.6. Array initializers

ArrayInitializer:

{ VariableInitializersopt ,opt }

因此,我们可以得出结论,您的表达式 不是 数组初始值设定项(它没有用大括号括起来)。所以我们开始创建数组:

15.10.1 Run-Time Evaluation of Array Creation Expressions

...然后,如果出现单个 DimExpr,则创建一个指定长度的一维数组,数组的每个组件都被初始化为其默认值(第 4.12.5 节)。强>

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

最后:

4.12.5. Initial Values of Variables

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

所以答案是是任何java实现都应该用零初始化字节数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2012-06-27
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多