本文主要是介绍List一边循环一边删除会如何?如何解决?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这一个很经典的面试题,相信很多求职者或者新手开发都遇见过。本文主要深究一下为什么list循环删除会抛出异常?如何避免这种情况?
一、增强for循环
package com.bootMybatis.demo;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** @Author: yd* @Date: 2020/7/18 10:17*/
public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("a");list.add("b");list.add("c");list.add("a");list.add("d");// foreachfor (String str: list) {if ("a".equals(str)) {list.remove(str);}}}
}
运行会抛出:java.util.ConcurrentModificationException 异常具体信息如下:
Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)at java.util.ArrayList$Itr.next(ArrayList.java:859)at com.bootMybatis.demo.ListDemo.main(ListDemo.java:23)
通过源码分析,我们可以看出来抛出的异常,当获取下一个元素的时候,会先去校验这两个变量是否相等,第一次remove之后,modCount的值由5变成了6,这样就导致了值不相同抛出异常。
二、普通for循环
package com.bootMybatis.demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("a");list.add("a");list.add("b");list.add("c");list.add("a");list.add("d");// 普通for循环for (int i = 0; i < list.size();i++){if (list.get(i).equals("a")){list.remove(list.get(i));}}for (String string:list) {System.out.println(string);}}
}
通过这种普通循环删除元素你会发现你要删除的元素存在多个时删除不完,因为删除元素后,数组下标变化了,下一个元素就不会进入比较了。
三、迭代器 用list的remove方法
package com.bootMybatis.demo;import org.hibernate.validator.constraints.EAN;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** @Author: yd* @Date: 2020/7/18 10:17*/
public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("a");list.add("a");list.add("b");list.add("c");list.add("a");list.add("d");// 迭代器循环Iterator<String> iterator = list.iterator();while(iterator.hasNext()){String str = iterator.next();if ("a".equals(str)){list.remove(str);}}}
}
这种方式会抛出和增强for循环一样的异常,引起的原因相同。
四、迭代器的remove方法
package com.bootMybatis.demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** @Author: yd* @Date: 2020/7/18 10:17*/
public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("a");list.add("a");list.add("b");list.add("c");list.add("a");list.add("d");// 迭代器循环Iterator<String> iterator1 = list.iterator();while(iterator1.hasNext()){String str = iterator1.next();if ("a".equals(str)){iterator1.remove();}}}
}
这种方式可以完美解决循环删除的问题。
五、JDK 1.8 的for循环
package com.bootMybatis.demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** @Author: yd* @Date: 2020/7/18 10:17*/
public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("a");list.add("a");list.add("b");list.add("c");list.add("a");list.add("d");// JDK 1.8 的循环list.forEach(str -> {if ("a".equals(str)){list.remove(str);}});System.out.println(list.size());}
}
这种方式也会抛出异常:java.util.ConcurrentModificationException ,我们可以通过源码发现还是由于expectedModCount和modCount的值不同导致的异常。
这篇关于List一边循环一边删除会如何?如何解决?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!