我们可以假设Java中的默认数组值吗?假设一个int数组设置为全零?

时间:2010-10-08 19:23:38

标签: java

在实践中我可以假设Java中的所有int数组都会以零填充吗?对于运行JVM的所有机器?

这适用于所有类型吗?炭?布尔?枚举?

这在哪里正式记录?

我已经说过教科书将int数组设置为零,但他们也建议你应该编写一个for循环来将所有值设置为零只是“更清楚”。

4 个答案:

答案 0 :(得分:135)

Java Language Specification是寻找此类信息的正确位置:

  

数组组件是未命名的变量,只要创建了一个新的数组对象,就会创建并初始化为默认值(第4.12.5节)

默认值本身在section 4.12.5中给出。

  
      
  • 对于字节类型,默认值为零,即(字节)0 的值。
  •   
  • 对于类型,默认值为零,即(短)0 的值。
  •   
  • 对于 int 类型,默认值为零,即 0
  •   
  • 对于类型,默认值为零,即 0L
  •   
  • 对于 float 类型,默认值为正零,即 0.0f
  •   
  • 对于 double 类型,默认值为正零,即 0.0d
  •   
  • 对于 char 类型,默认值为空字符,即'\ u0000'
  •   
  • 对于布尔类型,默认值为 false
  •   
  • 对于所有参考类型,默认值为 null
  •   

答案 1 :(得分:17)

是。 Java中的原始类型始终为零初始化。引用也初始化为null。

答案 2 :(得分:7)

它应该是Java语言规范 §4.12.5 Initial Values of Variables 。而不是§4.5.5

“对于类型字节,默认值为零,即(字节)0的值 对于short类型,默认值为零,即(short)0的值 对于int类型,默认值为零,即0 对于long类型,默认值为零,即0L 对于float类型,默认值为正零,即0.0f 对于double类型,默认值为正零,即0.0d 对于char类型,默认值为空字符,即'\ u0000' 对于boolean类型,默认值为false 对于所有引用类型(§4.3),默认值为null。“

答案 3 :(得分:4)

你的教科书错了!编写这样的代码毫无意义,浪费你的时间输入它和计算机运行它的时间。

正如其他人所说,编译器保证方法(类/实例变量)之外的变量的值为0,false或null。您可能知道编译器不会在方法值中提供变量,而是强制您在使用它们之前为它们赋值。

你会发现,如果你做的事情“正确”,大约90%-95%的“变量”在给出一个值之后永远不会改变。但是,新程序员倾向于做这样的事情:

int x = 0;

// some code that never uses x

x = 5;

// more code that only reads x and never modifies it.

这可以防止您将x标记为“最终”。如果你能够将x标记为“final”,那么它可以防止意外修改该值,从而防止错误。

我会写代码如下:

final int x;

// some code that never uses x

x = 5;

// more code that only reads x and never modifies it.

这称为空白最终(在声明时没有值的最终变量)。

如果你还记得运行时初始化了类/实例变量,那么你希望不会编写代码来使用丢弃值来初始化它们,然后你可以将它们标记为final。

我个人的做法是始终将所有内容标记为最终,直到我发现我需要修改它,并且永远不会初始化变量,直到我知道我希望它具有的实际值。这样做可以使代码更快(由于分配通常非常快,因此不会引人注意)并且更安全,因为我不应该在不应该修改值的情况下更加安全。