List集合刪除元素的正確姿態

2021-10-05 17:32:48 字數 2944 閱讀 5635

一、集合元素遍歷

在遍歷集合的時候,我們可能會根據業務的需要而需要排除集合的一些元素,通常我們遍歷list集合常用的有下列3種方式:

1.普通for迴圈

for(int i=

0; isize()

; i++

)

2.增強for

for(int i : list)
3.迭代器

iterator 

iterator = list.

iterator()

;while

(iterator.

hasnext()

)

二、集合元素的刪除

綜合上面三種方式測試刪除,**如下:

@test

public

void

test3()

catch

(exception e)

",e.

getclass()

.get******name()

);}try

catch

(exception e)

",e.

getclass()

.get******name()

);}try

catch

(exception e)

",e.

getclass()

.get******name()

);}}

// 初始化乙個list

public list

init()

// 普通for迴圈刪除

public

void

delete1()

} log.

info

("delete1 方法執行成功");

}// 迭代器刪除

public

void

delete2()

} log.

info

("delete2 方法執行成功");

}// 增強for迴圈

public

void

delete3()

} log.

info

("delete3 方法執行成功");

}

我們來看一下控制台輸出的結果:

21:03

:01.697

[main]

info com.kuake.concurrent.demotest - delete1 方法執行成功21:

03:01.701

[main]

info com.kuake.concurrent.demotest - delete2 方法執行成功21:

03:01.701

[main]

info com.kuake.concurrent.demotest - delete3 方法遍歷刪除出現異常,異常型別是concurrentmodificationexception

三、測試結果

>普通for刪除:刪除正常

>增強for刪除:刪除時丟擲異常concurrentmodificationexception

>迭代器刪除:刪除正常

四、異常**

為什麼使用增強for迴圈會丟擲這個異常呢。首先我來看看增強for遍歷編譯之後的**是怎麼樣。通過idea找到對應的class檔案。

public

void

delete3()

} log.

info

("delete3 方法執行成功");

}

原來我們的迭代器,在編譯之後,jvm也是把它翻譯成了使用迭代器進行遍歷。那麼我們就可以懷疑是不是迭代器遍歷的時候有什麼要求呢?當翻閱arraylist的迭代器原始碼時,看到了如下**。**片段如下:這是他的next()方法,

public e next()

上述方法中乙個checkforcomodification()**如下:

final

void

checkforcomodification()

modcount 是表示list集合的修改次數,expectedmodcount是合理操作時的逾期修改次數;正常操作時modcount==expectedmodcount

**原因:**是因為list.remove()方法會使得modcount++操作;而expectedmodcount儲存的還是原始值。然後當執行迭代器的 next()操作時就會丟擲上述異常。

五、迭代器的remove()方法

if

(lastret <0)

throw

newillegalstateexception()

;checkforcomodification()

;try

catch

(indexoutofbound***ception ex)

迭代器的remove方法 會將執行expectedmodcount = modcount操作。所以在下一次執行next()方法就不會丟擲異常。

六、小結

推薦使用 迭代器的remove()方法進行集合元素刪除操作。

List集合遍歷刪除元素

j a三種遍歷如何進行list的遍歷刪除 1 for迴圈 常見錯誤寫法 由於下標問題達不到想要效果 for int i 0 i應該改為 倒序操作避免下標問題 int size list.size for int i size 1 i 0 i 2 增強for迴圈 foreach迴圈 常見錯誤 會丟擲c...

List集合刪除元素的時候刪除不掉

今天博主遇到了list集合刪除元素失敗的問題,由於自以為對集合比較了解,所以首先排除集合刪除的語句的錯誤 integer index 1 list.remove index 但是錯誤就是出現在集合中,我的本意是集合刪除下標為制定資料的那一項內容,傳入的index是integer型別的,所以list集...

List集合刪除元素的時候刪除不掉

今天晚上遇到了list集合刪除元素失敗的問題,由於自以為對集合比較了解,所以首先排除集合刪除的語句的錯誤 integer index 1 list.remove index 但是錯誤就是出現在集合中,我的本意是集合刪除下標為制定資料的那一項內容,傳入的index是integer型別的,所以list集...