为了方便叙述,先写一个测试类,然后加入测试,看看哪种情况你也存在问题,欢迎大家都来晒问题,并给出问题分析
public class TestList { private List<Object> list = null; @Before public void init() { list = new ArrayList<Object>(); for (int i = 0; i < 10; i++) { list.add(new Object()); } } @After public void print(){ System.out.println(list.size()); for(Object str:list){ System.out.println(str); } } }
问题一:增强for循环移除list项,java.util.ConcurrentModificationException,不支持迭代移除
@Test public void testForLoop01() { /** * 增强的for循环遍历时候产生问题 * java.util.ConcurrentModificationException */ for (Object str : list) { list.remove(str); } }
问题二:size本身变化,i比较的值存在问题
@Test public void testForLoop02(){ /** * size在变化导致移除产生问题 */ for(int i=0;i<list.size();i++){ list.remove(i); } }
问题三:问题依旧,list大小随着移除本身变化问题,
@Test public void testForLoop03(){ int length=list.size(); for(int i=0;i<length;i++){ list.remove(i); } }
综上给出正确的方式
@Test public void testForLoop04(){ int length=list.size(); for(int i=length-1;i>0;i--){ list.remove(i); } }
问题四:既然增强的for循环是调用的迭代器,存在问题是由于并发修改报的错,那么是否可以用并发工具集合避免这个问题,测试解决
@Test public void testCurrentCollection(){ /** * 最终并没有一个需要的结果,虽然不报异常 */ list=new CopyOnWriteArrayList<Object>(); for (int i = 0; i < 10; i++) { list.add(new Object()); } for (Object str : list) { list.remove(str); } }