今天去面試了下,先總結面試的問題吧,然後在繼續複習集合,今天遇到個比較模糊的問題,對于我來說
1.list中删除元素
當時面試的時候我回答出在foreach中不可以删除元素,會出現異常,用疊代器的方式可以在循環中删除,當面試官問我為什麼會報錯的原因:我說删除元素的時候索引會有問(這點不正确),之後回來查資料,正确的回答應該是:在for中是可以删除元素(不過會有問題的,後面的所有元素索引都會前移,此時for循環的指針卻會下移,是以會略過下一個元素,解決方案是删除時将指針回調一次),foreach不支援删除,因為當我們把foreach循環反編譯之後是一個do while循環,類似疊代器的,删除完成後size的數量減1,但是cursor并沒有變化。導緻下一次循環不相等繼續向下執行,導緻檢查數組不通過,抛出java.util.ConcurrentModificationException,或者是删除之後直接break就沒問題,又或者是用copyonwritelist,因為copyonwritelist重寫的remove方法。
----ArrayList
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
----copyonwritelist
public boolean remove(Object o) {
Object[] snapshot = getArray();
int index = indexOf(o, snapshot, 0, snapshot.length);
return (index < 0) ? false : remove(o, snapshot, index);
}
for循環的例子:
for循環的例子
答案:
錯誤的例子的答案
解決方法上面有說到: 在調用remove方法之後執行 i--;
成功解決:
正确的答案