(點選上方公眾號,可快速關註)
來源:ImportNew – kobekillerjun
我以面試官的身份參加過很多Java的面試,以下是五個比較有技巧的問題,我發現有些初級到中級的Java研發人員在這些問題上沒有完全弄明白,似懂非懂。所以我寫了一篇相關的文章,幫助初級Java研發人員弄清楚這些問題。文章列舉了和Java ArrayList相關的5個比較具有迷惑性的問題,我相信如果面試者能夠很好的回答出這些問題,那麼在面試的時候你一定能夠得到不錯的分數。如果你同意我的看法,或者除了下麵的問題,你還有其他比較好的問題,那麼就請聯絡我吧。
1、ArrayList的大小是如何自動增加的?你能分享一下你的程式碼嗎?
這是最有技巧性的的一個問題,大多數人都無法回答。事實上,當有人試圖在arraylist中增加一個物件的時候,Java會去檢查arraylist,以確保已存在的陣列中有足夠的容量來儲存這個新的物件。如果沒有足夠容量的話,那麼就會新建一個長度更長的陣列,舊的陣列就會使用Arrays.copyOf方法被覆制到新的陣列中去,現有的陣列取用指向了新的陣列。看如下的程式碼段(摘自GrepCode.com中的Java ArrayList Code):
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.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);
}
}
請註意這樣一個情況:新建了一個陣列;舊陣列的物件被覆制到了新的陣列中,並且現有的陣列指向新的陣列。
2、什麼情況下你會使用ArrayList?什麼時候你會選擇LinkedList?
這又是一個大多數面試者都會困惑的問題。多數情況下,當你遇到訪問元素比插入或者是刪除元素更加頻繁的時候,你應該使用ArrayList。另外一方面,當你在某個特別的索引中,插入或者是刪除元素更加頻繁,或者你壓根就不需要訪問元素的時候,你會選擇LinkedList。這裡的主要原因是,在ArrayList中訪問元素的最糟糕的時間複雜度是”1″,而在LinkedList中可能就是”n”了。在ArrayList中增加或者刪除某個元素,通常會呼叫System.arraycopy方法,這是一種極為消耗資源的操作,因此,在頻繁的插入或者是刪除元素的情況下,LinkedList的效能會更加好一點。
3、當傳遞ArrayList到某個方法中,或者某個方法傳回ArrayList,什麼時候要考慮安全隱患?如何修複安全違規這個問題呢?
當array被當做引數傳遞到某個方法中,如果array在沒有被覆制的情況下直接被分配給了成員變數,那麼就可能發生這種情況,即當原始的陣列被呼叫的方法改變的時候,傳遞到這個方法中的陣列也會改變。下麵的這段程式碼展示的就是安全違規以及如何修複這個問題。
ArrayList被直接賦給成員變數——安全隱患:
修複這個安全隱患:
4、如何複製某個ArrayList到另一個ArrayList中去?寫出你的程式碼?
下麵就是把某個ArrayList複製到另一個ArrayList中去的幾種技術:
-
使用clone()方法,比如ArrayList newArray = oldArray.clone();
-
使用ArrayList構造方法,比如:ArrayList myObject = new ArrayList(myTempObject);
-
使用Collection的copy方法。
註意1和2是淺複製(shallow copy)。
5、在索引中ArrayList的增加或者刪除某個物件的執行過程?效率很低嗎?解釋一下為什麼?
在ArrayList中增加或者是刪除元素,要呼叫System.arraycopy這種效率很低的操作,如果遇到了需要頻繁插入或者是刪除的時候,你可以選擇其他的Java集合,比如LinkedList。看一下下麵的程式碼:
在ArrayList的某個索引i處新增元素:
刪除ArrayList的某個索引i處的元素:
看完本文有收穫?請轉發分享給更多人
關註「ImportNew」,提升Java技能