我以面試官的身份參加過不少Java的面試,如下是五個比較有技巧的問題,我發現有些初級到中級的Java研發人員在這些問題上沒有徹底弄明白,似懂非懂。因此我寫了一篇相關的文章,幫助初級Java研發人員弄清楚這些問題。文章列舉了和Java ArrayList相關的5個比較具備迷惑性的問題,我相信若是面試者可以很好的回答出這些問題,那麼在面試的時候你必定可以獲得不錯的分數。若是你贊成個人見解,或者除了下面的問題,你還有其餘比較好的問題,那麼就請聯繫我吧。
html
這是最有技巧性的的一個問題,大多數人都沒法回答。事實上,當有人試圖在arraylist中增長一個對象的時候,Java會去檢查arraylist,以確保已存在的數組中有足夠的容量來存儲這個新的對象。若是沒有足夠容量的話,那麼就會新建一個長度更長(爲以前數組的1.5倍)的數組,舊的數組就會使用Arrays.copyOf方法被複制到新的數組中去,現有的數組引用指向了新的數組。看以下的代碼段(摘自GrepCode.com中的Java ArrayList Code):(擴容會產生垃圾,佔用內存,性能較差)java
//ArrayList Add方法: public boolean add(E e){ ensureCapacity(size+1); //Increment modCount!! elementData[size++] = e; return true; } //ensureCapacity方法:處理ArrayList的大小 public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } }
這又是一個大多數面試者都會困惑的問題。多數狀況下,當你遇到訪問元素比插入或者是刪除元素更加頻繁的時候,你應該使用ArrayList。另一方面,當你在某個特別的索引中,插入或者是刪除元素更加頻繁,或者你壓根就不須要訪問元素的時候,你會選擇LinkedList。這裏的主要緣由是,在ArrayList中訪問元素的最糟糕的時間複雜度是」1″,而在LinkedList中可能就是」n」了。在ArrayList中增長或者刪除某個元素,(可能會須要移動不少項)一般會調用System.arraycopy方法,這是一種極爲消耗資源的操做,所以,在頻繁的插入或者是刪除元素的狀況下,LinkedList的性能會更加好一點。面試
當array被當作參數傳遞到某個方法中,若是array在沒有被複制的狀況下直接被分配給了成員變量,那麼就可能發生這種狀況,即當原始的數組被調用的方法改變的時候,傳遞到這個方法中的數組也會改變。下面的這段代碼展現的就是安全違規以及如何修復這個問題。數組
ArrayList被直接賦給成員變量——安全隱患:安全
修復這個安全隱患:ide
下面就是把某個ArrayList複製到另外一個ArrayList中去的幾種技術:性能
使用clone()方法,好比ArrayList newArray = oldArray.clone();this
使用ArrayList構造方法,好比:ArrayList myObject = new ArrayList(myTempObject);spa
使用Collection的copy方法。code
注意1和2是淺拷貝(shallow copy)。
在ArrayList中增長或者是刪除元素,要調用System.arraycopy這種效率很低的操做,若是遇到了須要頻繁插入或者是刪除的時候,你能夠選擇其餘的Java集合,好比LinkedList。看一下下面的代碼:
在ArrayList的某個索引i處添加元素:
刪除ArrayList的某個索引i處的元素: