一個問題引發對ArrayList的探索

下面這個代碼輸出是什麼?

A. 運行時異常

B. 正確運行,輸出str1

C. 正確運行,輸出str2

D. 編譯時出現異常

答案:A

答案中首先排除D選項,代碼是編譯肯定是通過的。其他的先上機操作驗真僞:

的確是運行時異常。

我們看下報錯的行數第51行。爲什麼是這行報錯?上源碼:

這個是List類接口定義的源碼,看方法上的註釋最後一行。if the index is out of range(如果傳入的index參數值小於0或者大於size)拋出IndexOutOfBoundsException。

下面再來看看ArrayList對此接口的實現:

方法第一行調用rangeCheckForAdd()方法,對List進行校驗,接着看此方法:

這裏看出來了就是我們上面說的:如果傳入的index參數值小於0或者大於size,拋出異常。


我們再來看看爲什麼報錯提示的是當前size爲1?

這裏要先看ArrayList的初始化List<String> list = new ArrayList();

ArrayList裏面有三種構造函數:

  1. 無參構造
  2. 傳入整數
  3. 傳入集合

以上三個構造函數初始化時都用到了類裏面定義的常量,我們先看下定義的常量再來解釋這三個構造函數

第一個常量就是聲明一個靜態常量,第二三個都是定義的一個空數組,但是這個是有區別的,第二個就是單純的一個空數組,而第三個定義的空數組,是隨着元素的插入,自動增加大小。第四個聲明一個數組,第五個聲明數組大小。

現在我們再轉過去看第一個構造函數,無參構造函數。當初始化List的時候,elementData被賦值DEFAULTCAPACITY_EMPTY_ELEMENTDATA,這個數組最開始就是空的,當執行list.add("str1")的時候,數組size+1,然後插入數據。如下圖:

結合最上面的源碼,這樣就能解釋爲什麼第51行執行的時候會報錯了(即運行時報錯)。。。

ps. 有參構造,我下一篇在進行解讀。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章