这个点是老师上课讲过的,但是写实验的时候反复犯错,在此记录一下,加深印象,提醒自己。
Java集合类,例如List,对其进行遍历,如果遍历时要删除元素,很容易出错。
普通for循环(下标遍历):移除不完全。
增强for循环:移除一个正确,移除第二个就会抛出ConcurrentModificationException。
迭代器+集合类remove方法混合:移除不完全。
错误示例1:
public static void dropCourse6(ArrayList<String> subjects)
{
MyIterator<String> iter = new MyIterator(subjects);
while(iter.hasNext())
{
String subject = iter.next();
if(subject.startsWith("6"))
{
subjects.remove(subject);
}
}
}
运行test://dropCourse(["6.045", "6.005", "6.813"])
//expected [], actual ["6.005"]
SnapShot diagram分析:
错误示例2:增强for循环--并发修改异常
for(String subject: subjects)
{
if(subject.startsWith("6."))
{
subjects.remove(subject);
}
}
解决方案:用迭代器遍历,并且删除时用迭代器的remove方法。
while(iter.hasNext())
{
String subject = iter.next();
if(subject.startsWith("6"))
{
iter.remove();
}
}