2010-08-06 61 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是通過運行其初始化數組的構造方法,同時創建該對象