Java之關於ArrayList的5道面試題

1、ArrayList的大小是如何自動增加的?你能分享一下你的代碼嗎?

這是最有技巧性的的一個問題,大多數人都無法回答。事實上,當有人試圖在arraylist中增加一個對象的時候,Java會去檢查arraylist,以確保已存在的數組中有足夠的容量來存儲這個新的對象。如果沒有足夠容量的話,那麼就會新建一個長度更長的數組,舊的數組就會使用Arrays.copyOf方法被複制到新的數組中去,現有的數組引用指向了新的數組。看如下的代碼段:

Java之關於ArrayList的5道面試題


請注意這樣一個情況:新建了一個數組;舊數組的對象被複制到了新的數組中,並且現有的數組指向新的數組。

2、什麼情況下你會使用ArrayList?什麼時候你會選擇LinkedList?

這又是一個大多數面試者都會困惑的問題。多數情況下,當你遇到訪問元素比插入或者是刪除元素更加頻繁的時候,你應該使用ArrayList。另外一方面,當你在某個特別的索引中,插入或者是刪除元素更加頻繁,或者你壓根就不需要訪問元素的時候,你會選擇LinkedList。這裡的主要原因是,在ArrayList中訪問元素的最糟糕的時間複雜度是”1″,而在LinkedList中可能就是”n”了。在ArrayList中增加或者刪除某個元素,通常會調用System.arraycopy方法,這是一種極為消耗資源的操作,因此,在頻繁的插入或者是刪除元素的情況下,LinkedList的性能會更加好一點。

3、當傳遞ArrayList到某個方法中,或者某個方法返回ArrayList,什麼時候要考慮安全隱患?如何修復安全違規這個問題呢?

當array被當做參數傳遞到某個方法中,如果array在沒有被複制的情況下直接被分配給了成員變量,那麼就可能發生這種情況,即當原始的數組被調用的方法改變的時候,傳遞到這個方法中的數組也會改變。下面的這段代碼展示的就是安全違規以及如何修復這個問題。

ArrayList被直接賦給成員變量——安全隱患:

Java之關於ArrayList的5道面試題

修復這個安全隱患:

Java之關於ArrayList的5道面試題

4、如何複製某個ArrayList到另一個ArrayList中去?寫出你的代碼?

下面就是把某個ArrayList複製到另一個ArrayList中去的幾種技術:

  1. 使用clone()方法,比如ArrayList newArray = oldArray.clone();
  2. 使用ArrayList構造方法,比如:ArrayList myObject = new ArrayList(myTempObject);
  3. 使用Collection的copy方法。

注意1和2是淺拷貝(shallow copy)。

5、在索引中ArrayList的增加或者刪除某個對象的運行過程?效率很低嗎?解釋一下為什麼?

在ArrayList中增加或者是刪除元素,要調用System.arraycopy這種效率很低的操作,如果遇到了需要頻繁插入或者是刪除的時候,你可以選擇其他的Java集合,比如LinkedList。看一下下面的代碼:

在ArrayList的某個索引i處添加元素:

Java之關於ArrayList的5道面試題

刪除ArrayList的某個索引i處的元素:

Java之關於ArrayList的5道面試題


分享到:


相關文章: