2010-08-06 89 views
102

所以我声明和初始化一个int数组:Java中数组的默认初始化是什么?

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,这意味着我不必遍历数组并初始化它是否安全?

谢谢。

+3

刚刚阅读文档;)http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 – Benj 2015-06-30 07:31:39

回答

215

Java程序中的所有内容都未被程序员显式设置为某个东西,它被初始化为零值。

  • 对于引用(任何持有对象的东西),即null
  • 对于int/short/byte/long,即0
  • 对于浮动/双重是0.0
  • 对于布尔值是false
  • 对于字符为空的字符'\u0000'(其十进制等效值为0)。

当你创建一个东西的数组时,所有的条目也被归零。因此,您的数组在由new创建之后立即包含五个零。注意(基于注释):当分配本地变量时,Java虚拟机不需要清除底层内存(如果需要,这可以实现高效的堆栈操作),以避免Java语言规范需要局部变量的随机值被初始化。

+0

评论供长时间讨论;这个对话已经[转移到聊天](http://chat.stackoverflow.com/rooms/158333/discussion-on-answer-by-thorbjorn-ravn-andersen-what-is-the-default-initializati)。 – 2017-11-06 15:50:09

48

Java Language Specification

  • 每个类变量,实例变量,或阵列组分与创建时的默认值初始化(§15.9,§15.10):

    • 对于字节类型,默认值为零,即值为(byte)0
    • 对于short类型,默认值为零,即值为(short)0
    • 对于int类型,默认值为零,即0
    • 对于long类型,默认值为零,即0L
    • 对于浮点类型,默认值为正零,即0.0f
    • 对于double类型,默认值为正零,即0.0d
    • 对于char类型,默认值为空字符,即'\u0000'
    • 对于布尔类型,默认值为false
    • 对于所有参考类型(§4.3),默认值为null
+2

那么Long和s的数组又如何呢? – 2012-12-18 10:39:47

+1

@GeorgyDobrev。这些是参考类型。根据上述规范,它们将为空。 – 2012-12-19 14:39:12

+0

字符串数组怎么样? – Zac 2017-12-23 07:05:24

16

JLS清楚地说

数组初始化创建一个数组,并提供了其所有组件的初始值。

这与数组是否是实例变量或局部变量或类变量无关。

对于基本类型的默认值:docs

对于对象的默认值是null

+1

不回答问题。他正在询问关于默认初始化。 – EJP 2014-01-21 06:41:43

2

据的java,

数据类型 - 默认值

字节 - 0

短 - 0

INT - 0

长 - 0L

浮 - 0.0F

双 - 0.0D

字符 - '\ u0000的'

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

布尔 - 假

+2

他并不是在问领域,他在问阵列组件。 – EJP 2014-01-21 06:42:52

+2

@EJP可以请你详细说明什么是数组组件的含义?一般数组有一些数据类型(相同类型),这是初始化如上所以你可以告诉我,意思是组件? – 2014-01-28 10:37:44

2

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

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

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

所以Java是通过运行其初始化数组的构造方法,同时创建该对象