Java中数组的默认初始化是什么?


144

所以我要声明并初始化一个int数组:

static final int UN = 0;
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
    arr[i] = UN;
}

说我改为这样做...

int[] arr = new int[5];
System.out.println(arr[0]);

... 0将按标准输出。另外,如果我这样做:

static final int UN = 0;
int[] arr = new int[5];
System.out.println(arr[0]==UN);

... true将按标准输出。那么Java默认如何初始化我的数组?是否可以安全地假设默认初始化将数组索引设置为零,0这意味着我不必遍历数组并对其进行初始化?

谢谢。


Answers:


281

Java程序中所有未由程序员明确设置为某种东西的东西都被初始化为零值。

  • 对于的引用(任何包含对象的内容)null
  • 对于int / short / byte / long,它是一个0
  • 对于float / double,这是一个 0.0
  • 对于布尔值,则为false
  • 对于char是空字符'\u0000'(其十进制等效值为0)。

当您创建某物的数组时,所有条目也会被清零。因此,数组由创建后立即包含五个零new

注意(基于注释):分配局部变量时,不需要Java虚拟机将基础内存清零(如果需要,这可以进行有效的堆栈操作),因此为了避免随机值,Java语言规范要求初始化局部变量。


评论不作进一步讨论;此对话已转移至聊天
布拉德·拉尔森

编译器会告诉您,除了局部变量外,其他所有东西都没有初始化为任何东西。
罗恩侯爵,

答案末尾提到的@ user207421。
托尔比约恩Ravn的安德森

这意味着您回答的第一句话不正确,应予以修改。您在聊天中的“您如何知道”问题毫无意义。JLS这样说,就是这样,编译器也强制执行了。
罗恩侯爵,

@ user207421“程序员未明确将其设置为某些内容”(编译器可能需要)。
托尔比约恩Ravn的安德森

60

Java语言规范中

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

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

2
那么Long和Integer的数组呢?
乔治·杜波夫

1
@GeorgyDobrev。这些是参考类型。根据上述规范,它们将为null。
戴夫·科斯塔

字符串数组呢?
Zac

1
@Zac与上面相同,一个String是一个对象,因此数组中的默认值为null
戴夫·科斯塔


3

根据java,

数据类型-默认值

字节-0

短-0

整数-0

长-0L

浮动-0.0f

双-0.0d

字符-'\ u0000'

字符串(或任何对象)-null

布尔值-假


2
他不是在问字段,而是在问数组组件。
2014年

3
@EJP您能详细说明一下数组组件的含义吗?通常数组具有一些数据类型(相同类型),其初始化如上所述,所以你能告诉我组件的意思吗?
Abhishek Singh 2014年


2

Java中的每个类都有一个构造函数(构造函数是在创建新对象时会调用的方法,该对象将初始化类变量的字段)。因此,当您创建类的实例时,在创建对象时会调用构造方法,并且所有数据值都将在此时初始化。

对于整数数组类型的对象,在构造函数方法中,将数组中的所有值初始化为0(零)。同样,对于布尔数组的对象,所有值都初始化为false。

因此,Java通过在创建对象时运行其构造函数方法来初始化数组


1

Java表示,初始化时JAVA数组的默认长度为10。

private static final int DEFAULT_CAPACITY = 10;

但是该size()方法返回数组中已插入元素的数量,并且由于初始化时,如果尚未在数组中插入任何元素,则它将返回零。

private int size;

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

public void add(int index, E element) {
    rangeCheckForAdd(index);
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,size - index);
    elementData[index] = element;
    size++;
}

2
看起来像ArrayList,而不是数组。
托尔比约恩Ravn的安徒生
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.