首先我們給出這道面試題的**以及題目:
lista = new arraylist();list.add("1");
list.add("2");
for(string item : list)
}
問:上段**執行會報錯嗎?如果把」1」換成「2」會報錯嗎?為什麼?
首先給出答案:
上面這段**執行不會報錯。
把」1」換成「2」再執行就會報錯。
為什麼呢?那麼我們怎麼來發現它背後的秘密呢?答案只有乙個:那就是通過原始碼來解惑(arraylist部分原始碼)。
public e remove(intindex)
public
boolean
remove(object o)
} else
}return
false;}
private
void fastremove(int
index)
/*** an optimized version of abstractlist.itr */
private
class itr implements iterator
@suppresswarnings("unchecked")
public
e next()
public
void
remove()
catch
(indexoutofbound***ception ex)
}final
void
checkforcomodification()
}
我們通過查詢arraylist的原始碼,可以清楚的知道,它的內部是有乙個迭代器類的,然後它的底層其實就是乙個陣列而已。對於要刪除乙個arraylist中的某些元素的時候,我們可以通過遍歷下標,找到要刪除的元素,直接通過下標刪除,或者通過arraylist的迭代器進行刪除,千萬不能直接用foreach遍歷刪除。還有就是遇見問題看到表象要想著去找本質,懂了原理才能知其然知其所以然。
一道面試題引發的思考
好的面試官能夠能好的和面試者互動,而一場好的面試也能帶給面試者更多的思考 面試官給我出題後的 1 分鐘內,我給出了第一種思路 排序。將數字按公升序排序,去除最小的那個數即可。存在問題 時間複雜度高,只考慮了正數的情況。面試官給出了第一次提示時間複雜度過高,要求降低時間複雜度。於是在經過幾分鐘思考後,...
一道面試題的思考
在繼承中new和override相同點和區別?看下面的 有乙個基類a,b1和b2都繼承自a,並且使用不同的方式改變了父類方法print 的行為。測試 輸出什麼?為什麼?public void dotest public class a public class b1 a public class b...
百度一道面試題引發的思考
下面我將寫寫我對這道題的本質思考得到的三種方法 以下方法都對應函式的名字 一 sumget方法 這個題說只有乙個數是重複的,那撇開這個數,也就是說1到100的數都會出現,於是我把所有101個數相加起來,最後再減去1到100的和,不就出來了嗎?二 flagget方法 做標記是乙個好方法。可以建立乙個陣...