【问题标题】:Do we need to initialize an array in Java? [duplicate]我们需要在 Java 中初始化一个数组吗? [复制]
【发布时间】:2026-01-30 21:35:01
【问题描述】:

我注意到如果我将数组声明为:

int[] myarr = new int[10];

我可以直接使用myarr[1] ++;,这样myarr[1] = 1。是不是意味着在Java中,我们不需要需要通过下面的方法初始化数组并将每个值设置为0?

for (int i = 0; i < myarr.length; i++) {
     myarr[i] = 0;
}

我从一些 cmets 中看到该数组可能包含垃圾值。如果数组是整型数组,会不会包含除0以外的垃圾?

【问题讨论】:

  • 需要用Java初始化anything吗?

标签: java


【解决方案1】:

在 Java 中,所有数组元素都会自动初始化为默认值。对于原始数值类型,即00.0。对于布尔值,即false。对于对象,这是null

在 C++ 等其他语言中,未初始化数组中的值是未定义的。出于安全考虑,某些编译器可能会类似地初始化为 0/null,并且依赖它是非常糟糕的做法。但是,这种行为在 Java 中已经得到很好的定义,因此创建一个原始数组并相信其值为 0 是完全可以的。

【讨论】:

【解决方案2】:

根据语言规范,新初始化的int[] 将用零填充。

参考JLS §10.6 (Array Initializers)

创建指定长度的一维数组,并将数组的每个组件初始化为其默认值(第 4.12.5 节)。

参考§4.12.5

  • 每个类变量、实例变量或数组组件在创建时都会使用默认值进行初始化(第 15.9 节、第 15.10.2 节):
    • 对于byte类型,默认值为0,即(byte)0的值。
    • 对于short类型,默认值为0,即(short)0的值。
    • 对于int类型,默认值为0,即0。
    • 对于long类型,默认值为0,即0L。
    • 对于float类型,默认值为正零,即0.0f。
    • 对于double类型,默认值为正零,即0.0d。
    • 对于char类型,默认值为空字符,即'\u0000'。
    • 对于布尔类型,默认值为 false。
    • 对于所有引用类型(第 4.3 节),默认值为 null。

【讨论】:

    【解决方案3】:

    不,所有 java 数组都填充了适当的类型默认值(整数为 0,双精度为 0.0,引用为 null,...)

    【讨论】:

      【解决方案4】:

      你不能跳过数组的初始化,但你不必初始化数组的每个元素。如果您不初始化数组中的元素,它的工作方式与您不初始化该特定类型的成员变量时完全一样:Java 将使用类型默认值初始化它,对于数字原始类型(int, double, float...), false 表示布尔值,null 表示对象(包括字符串)。

      【讨论】:

        【解决方案5】:

        不,在java中初始化一个数组是强制性的。当我写我的程序时,我没有初始化我的数组,我的编译器(jdk7)给了我一个错误,比如:

        ArrayOne.java:4: 变量 myArray 可能尚未初始化。

        因此我的编译失败了。

        【讨论】:

        • 这不是一回事:它是说你从未初始化数组变量,而不是它的组件。它也会对非数组变量做同样的事情。此要求称为明确分配
        • 如果您想知道,这在JLS section 4.12.5 中有描述:“局部变量(第 14.4 节,第 14.14 节)必须在使用之前显式地赋予一个值,通过初始化(第 14.4 节) ) 或赋值 (§15.26),其方式可以使用明确赋值规则 (§16 (Definite Assignment)) 进行验证。”
        • 感谢您的参考..