一、集合元素遍歷
在遍歷集合的時候,我們可能會根據業務的需要而需要排除集合的一些元素,通常我們遍歷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集...