Java中List 刪除元素,list.remove()、Iterator的注意事項

? ? 在Java中,使用List時想要刪除某個特定個元素怎么辦?很好辦!因為List接口有remove()這個方法,我們只需要調用remove()方法,就可以刪除list中的某個元素。但是list自帶的有一些坑,在相鄰有相同元素時會掉坑:

使用list.remove()刪除:


我們看到有兩個“a”元素相鄰,但是刪除時卻只刪除了一個,這是為何呢?因為刪除時,每刪除一個元素,后邊的元素都會左移一位,也就是下標會減1,在for循環(huán)中,刪除第一個“a”時,i(下標)為0,此時list重排,后邊的元素全部左移1位,也就是說第二個“a”元素的下標從1變?yōu)榱?,而此時for循環(huán)進行已經第二次循環(huán)了,執(zhí)行了i++,i的值為1,對應為“b”元素,然后向后循環(huán),再也找不到“a”元素了。所以相鄰元素有重復的話,只能刪除一個。這明顯不符合我們的需求。

那解決辦法是什么呢?

1.刪除后元素后,i-1

刪除一個元素后,后邊的元素左移1位,此時i-1,保證了下次循環(huán)能訪問到左移了1位的元素。

2.反向刪除

我們先從后邊的元素開始循環(huán),一個一個的往前面循環(huán),找出特定元素刪除

這樣,就算刪除了倒數(shù)第一個"a"元素,list重排,也只是把后邊的元素左移1位,此時倒數(shù)第一個“a”元素(下標為1)被刪除,接著b替代了a成為了下標為1的元素,但前邊的元素不變,i--? = 0 后依然能夠找到其相鄰的a元素。

3.使用迭代器刪除(iterator)(推薦)

Iterator.remove()方法

Iterator.remove() 方法會在刪除當前迭代對象的同時,會保留原來元素的索引。所以用迭代刪除元素是最保險的方法,建議大家使用List過程,這其實和上面第一中方法類似,只不過iterator內部幫我們做了類似i-1的操作。推薦使用這種做法,因為我們不保證每次都記得手動把下標減去1。

4.賦值給新的list

賦值給新list

其實我們可以轉換思維,可以過濾掉不需要的元素后賦值給新的list對象,利用java8的lambda表達式和強大的stream流形式進行內部迭代來過濾掉特定元素,我們只需一行代碼就可以實現(xiàn)。雖然這種方式比較簡潔,但是定義了新變量,舊的list就只能等待漫長的gc了。


注意:

1.在進行普通for循環(huán)刪除時,不要把list.size()抽離出去賦值給變量,然后用此變量做為for條件, 因為刪除時,list.size()的值是會改變的,要把list.size作為for條件。

2.不能在增強for(foreach)里使用list.remove()方法,因為foreach循環(huán)會把list以iterator方式進行迭代,調用list.remove()后會使iterator.hasNext()出問題。

3.在使用iterator時,循環(huán)體內只能執(zhí)行一次iterator.next()方法,因為執(zhí)行一次iterator.next(),會使list下標后1位

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容