Java中数组的默认初始化是什么?
所以我声明和初始化一个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
,这意味着我不必遍历数组并初始化它是否安全?
谢谢。
Java程序中的所有东西都没有被程序员明确地设置,被初始化为零值。
- 对于引用(保存对象的任何东西),它是
null
。 - 对于int / short / byte / long,即0。
- 对于float / double是0.0
- 对于布尔是错误的。
- 对于空字符'\ u0000'(其十进制等效值为0)的字符。
当你创build一个东西的数组,所有的条目也被归零。 所以你的数组在被new
创build之后包含五个零。
注意(基于注释):在分配本地variables时,Java虚拟机不需要清除底层内存,因此Java语言规范要求对它们进行初始化。
从Java语言规范 :
每个类variables,实例variables或数组组件在创build时都会使用默认值进行初始化(第15.9节,第15.10节):
- 对于types字节,默认值为零,即
(byte)0
的值。- 对于shorttypes,默认值为零,也就是
(short)0
的值。- 对于inttypes,默认值为0,即
0
。- 对于longtypes,默认值为0,即
0L
。- 对于浮点types,默认值为正零,即
0.0f
。- 对于doubletypes,默认值为正零,即
0.0d
。- 对于chartypes,默认值是空字符,即
'\u0000'
。- 对于布尔types,默认值为
false
。- 对于所有的引用types(§4.3),默认值为
null
。
JLS明确表示
数组初始化器创build一个数组并为其所有组件提供初始值。
这与数组是实例variables还是局部variables或类variables无关。
基本types的默认值: docs
对于对象,默认值为null
。
据java介绍,
数据types – 默认值
字节 – 0
短 – 0
int – 0
长 – 0L
浮动 – 0.0f
双 – 0.0d
char – '\ u0000'
string(或任何对象) – null
布尔值 – false
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++; }
Java中的每个类都有一个构造函数(构造函数是在创build新对象时初始化类variables的字段时调用的方法)。 所以当你创build一个类的实例的时候,在创build对象的时候调用构造函数方法,并且在那个时候所有的数据值都被初始化了。
对于整数数组types的对象,数组中的所有值都在构造方法中初始化为0(零)。 对于布尔数组的对象也是类似的,所有的值都被初始化为false。
所以Java在创build对象时通过运行它的构造方法来初始化数组
ThorbjørnRavn Andersen回答了大多数的数据types。 由于有关arrays的讨论热烈,
从jls规范引用http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 “数组组件在创build时使用默认值进行初始化”
我认为无论数组是本地还是实例或类variables,它都将使用默认值