我们可以使用Java中的默认数组值吗?例如,假设int数组设置为全零?


77

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

所有类型都适用吗?炭?布尔值?枚举?

正式记录在哪里?

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


14
扔掉那些教科书。在最坏的情况下他们应该告诉你打电话给Arrays.fill(myArr, 0)。但这仍然是一个荒谬的建议,实际上,如果这是一个明确的问题,请加上一个该死的评论,请不要做不必要的工作。
马克·彼得斯2010年

6
Java语言保证将变量初始化为默认值(false,0,null,具体取决于类型)。无需手动初始化数组,这只是浪费CPU周期。
郭富城2010年

1
这些教科书可能是由C / C ++程序员编写的,对于这些教科书,新分配的数组具有未定义的内容。Java努力避免未定义的行为。
Raedwald 2013年

当系主任指定C / C ++老师在没有任何额外培训的情况下教授Java课时,就会发生这种情况,作者甚至可能是这种老师的学生……而这里我们要解决的是过时的假设。
Jason K.

Answers:


138

Java语言规范是查找此类信息的正确位置:

数组组件是未命名的变量,每当创建一个作为数组的新对象时,它们都会创建并初始化为默认值(第4.12.5节)

默认值本身在第4.12.5节中给出

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

您可以将空字符视为零吗?计算明智?
committedandroider

好答案。我自己对此很好奇。
ktm5124 2015年


7

应该是Java语言规范§4.12.5变量的初始值。代替§4.5.5

“对于字节类型,默认值为零,即(字节)0的值。
对于类型短类型,默认值为零,即(短)0的值。
对于类型int,类型为默认值为零,即0。
对于long类型,默认值为零,即0L;
对于float类型,默认值为正零,即0.0f;
对于double类型,默认值为正零。 ,即0.0d,
对于char类型,默认值为空字符,即'\ u0000';
对于boolean类型,默认值为false;
对于所有引用类型(第4.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 int x;

// some code that never uses x

x = 5;

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

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

如果您记得类/实例变量是在运行时初始化的,那么希望您不要编写代码以使用抛弃值初始化它们,然后可以将它们标记为final。

我的个人实践是始终将所有内容标记为最终值,直到我发现需要对其进行修改为止,并​​且永远不要初始化变量,直到我知道所需的实际值为止。这样做可以使代码更快(由于分配通常非常快,因此不会引起注意)并且更安全,因为我很少在不应该修改时不小心修改值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.