Java循环删除集合多个元素的正确打开方式
首先说下不正确的打开方式:
第一:使用for循环删除集合的元素,示例代码如下
1 ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); 2 for (int i = 0; i < list.size(); i++) { 3 list.remove(i); 4 } 5 System.out.println(list);
结果输出为:
[b, d]
解说开始:
首先看下源码:
1 public E remove(int index) { 2 rangeCheck(index); 3 modCount++; 4 E oldValue = elementData(index); 5 int numMoved = size - index - 1; 6 if (numMoved > 0) 7 System.arraycopy(elementData, index+1, elementData, index, 8 numMoved); 9 elementData[--size] = null; // clear to let GC do its work 10 return oldValue; 11 }
解释:第一次进for循环,i=0 ,调用remove方法删除第一位的元素, 集合大小收缩,第一次删除完成后,list变成【b,c,d】;再次循环,i=1,调用remove方法删除了c 集合大小再次收缩,list变成【b,d】;再次循环,i=2,不符合条件,循环结束
第二:使用foreach循环删除元素,示例代码如下
1 ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); 2 for (String s : list) { 3 if (s.equals("b")) 4 list.remove(s); 5 } 6 System.out.println(list);
结果:这段代码居然抛出了异常 java.util.ConcurrentModificationException。
解说开始:
首先看下源代码:
1 public Iterator<E> iterator() { 2 return new Itr(); 3 } 4 /** 5 * An optimized version of AbstractList.Itr 6 */ 7 private class Itr implements Iterator<E> { 8 int cursor; // index of next element to return 9 int lastRet = -1; // index of last element returned; -1 if no such 10 int expectedModCount = modCount; 11 public boolean hasNext() { 12 return cursor != size; 13 } 14 @SuppressWarnings("unchecked") 15 public E next() { 16 checkForComodification(); 17 int i = cursor; 18 if (i >= size) 19 throw new NoSuchElementException(); 20 Object[] elementData = ArrayList.this.elementData; 21 if (i >= elementData.length) 22 throw new ConcurrentModificationException(); 23 cursor = i + 1; 24 return (E) elementData[lastRet = i]; 25 } 26 public void remove() { 27 if (lastRet < 0) 28 throw new IllegalStateException(); 29 checkForComodification(); 30 try { 31 ArrayList.this.remove(lastRet); 32 cursor = lastRet; 33 lastRet = -1; 34 expectedModCount = modCount; 35 } catch (IndexOutOfBoundsException ex) { 36 throw new ConcurrentModificationException(); 37 } 38 } 39 final void checkForComodification() { 40 if (modCount != expectedModCount) 41 throw new ConcurrentModificationException(); 42 } 43 }
解释:在Java中的foreach循环的工作原理就像一个iterator。
so,接下来说下正确的打开方式——
1 ArrayList<Integer> a=new ArrayList<Integer>(15); 2 a.add(222); 3 a.add(3); 4 a.add(333); 5 a.add(000); 6 a.add(333); 7 a.add(4); 8 9 for(int s=a.size()-1;s>=0;s--){ 10 if(a.get(s).intValue()==333){ 11 a.remove(s); 12 } 13 }
1 privatevoid screenBlackNameList(List<SharedBoardSmsWrapper> source, List<BlackNameListModel> blackNameList){ 2 Iterator<SharedBoardSmsWrapper> sourceIt=source.iterator(); 3 while(sourceIt.hasNext()){ 4 SharedBoardSmsWrapper tmpSharedBoardSmsWrapper=sourceIt.next(); 5 Iterator<BlackNameListModel> blackNameListIt=blackNameList.iterator(); 6 while(blackNameListIt.hasNext()){ 7 BlackNameListModel tmpBlackNameListModel=blackNameListIt.next(); 8 if(tmpSharedBoardSmsWrapper.getSource().equals(tmpBlackNameListModel.getSource())){ 9 sourceIt.remove(); 10 break; 11 } 12 } 13 } 14 }
转载于:https://www.cnblogs.com/mayiwen/p/5530856.html
Java循环删除集合多个元素的正确打开方式相关推荐
- Java 循环删除list中指定元素
Java 循环删除list中指定元素 1.for循环遍历删除指定元素 2.增强for循环删除指定元素 3.iterator删除指定元素 1.for循环遍历删除指定元素 List<String&g ...
- java循环删除集合数据_java中循环的几种方式以及删除集合中的指定数据
一.for //for循环中删除数据 -- 方法有漏洞 private static void deleteAtFor() { ArrayList array = new ArrayList<& ...
- java删除集合元素吗_java如何删除集合中的元素
java如何删除集合中的元素 如何使用java删除集合中的'元素呢?下面是小编给大家提供的删除集合中元素的常见方法,欢迎阅读,更多详情请关注应届毕业生考试网. Java代码如下: package co ...
- for循环删除集合陷阱
首先看下面的代码: import java.util.LinkedList; import java.util.List; public class DeleteCollection { ...
- JAVA中循环删除集合中元素的方法总结
一.list集合循环删除元素 1.通过普通的for删除删除符合条件的多个元素 for(int i=0;i<list.size();i++){if(list.get(i).equals(" ...
- 循环的时候去删除集合中的元素 java.util.ConcurrentModificationException
使用for循环,删除集合中的元素,会报错 java.util.ConcurrentModificationException 只能通过迭代器 iterator删除 1:在while循环中使用itera ...
- Java中删除集合中的指定元素
引出问题 当我们从集合中找出某个元素并删除的时候可能出现一种并发修改异常问题. 哪些遍历存在问题? a.迭代器遍历集合且直接用集合删除元素的时候可能出现. b.增强for循环遍历集合且直接用集合删除元 ...
- PageCollectionView[Bug],使用Filter的时候,删除集合中的元素,会导致ArgumentOutOfRangeException...
PageCollectionView,没有使用Filter的时候一切正常:当使用Filter的时候,删除集合中的元素,会抛出如下异常: 1: 指定的参数已超出有效值的范围.\n参数名: index 2 ...
- vue中如何在方法中动态的删除集合中的元素!?
参考https://blog.csdn.net/weixin_42230550/article/details/87990486 vue中,如何在方法中动态的删除集合中的元素? me.btn_elem ...
最新文章
- php验证码内置函数,刚写了一个PHP的高效验证码函数 | 学步园
- Vivado HLS基本应用
- DockerCompose构建Springboot项目
- UVAoj 11324 - The Largest Clique(tarjan + dp)
- 最详细MySQL的安装与介绍Windows
- [设计模式][C++]单例模式
- wifi精灵android版,WiFi精灵安卓版
- Deep Learning-Deep feedforward network
- cactiez mysql密码_CactiEZ中文解决方案+使用教程(1)
- 各国的 电视制式 度量衡 电压
- 到底学机械好还是学计算机好,大学同学一个选择学机械,另一个学计算机,对比5年后收入蒙了...
- 【数学 博弈论】JZOJ_3339 wyl8899和法法塔的游戏
- python京东自动签到_python自动签到领京东《豆豆》
- dz论坛修改html编辑器,discuz插件推荐:编辑器H5上传
- tomcat启动异常:A child container failed during start
- 电子印章结构以及规范讲解
- PostgreSQL , PostGIS , 球坐标 , 平面坐标 , 球面距离 , 平面距离
- 排序(数据结构与算法)
- easyUI FileBox(文件框)的setValue不能用,回显文件名称则可以用prompt代替
- 【181018】基于MFC文档方式制作的飞碟射击游戏