天天看點

java list 删除元素_面試中遇到的問題(list中删除元素 問題)

今天去面試了下,先總結面試的問題吧,然後在繼續複習集合,今天遇到個比較模糊的問題,對于我來說

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循環的例子:

java list 删除元素_面試中遇到的問題(list中删除元素 問題)

for循環的例子

答案:

java list 删除元素_面試中遇到的問題(list中删除元素 問題)

錯誤的例子的答案

解決方法上面有說到: 在調用remove方法之後執行 i--;

成功解決:

java list 删除元素_面試中遇到的問題(list中删除元素 問題)

正确的答案