Java动态 遍历List 时删除List特征元素 异常问题 及解决方案总结
首先。这是一个极其简单的问题,大牛可忽略。新手可能会遇到,Java中遍历某个List 时删除该List元素 会抛出异常。
这一个简单的问题再高手严重不值一提,但新手可能会比較困惑,用哪种方式能够安全有效的实现遍历list删除某些特征元素?
方式:
方法1、普通for循环 遍历List,删List除自身 特征条目;
方法2、高级for循环 遍历List。删除List自身 特定条目;
方法3、引入參考List。for循环遍历删除原List 特定条目;
方法4、利用iterator 遍历删除List特定条目
结论:
方法1:不会抛异常 但结果 未必正确 因为list.size()在变动 依据脚标删除的未必是 特征元素;
方法2:会抛异常
:java.util.ConcurrentModificationException;
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
方法3:可实现目的,通过引入一个參考list for循环遍历參考list 在循环过程中 满足条件出 删除原list条目。能够达到所需目的。
方法4:可实现目的。通过list.iterator();方法拿到iterator对象 调用iterator.remove();方法可达到所需目的且不会抛异常。
这个问题 最好亲自执行代码。尝试,方能更好理解。
不废话。上代码,自己执行一下便可:
package com.kevin.test; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random; /**
* 动态删除 List 特征元素 演示样例
*
* @author blj
*
*/
public class TestMain
{ static class Bean
{ private String name; public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} } /**
* @param args
*/
public static void main(String[] args)
{ dynamicRemoveItemFromListDemo();
} /**
* 动态删除List元素演示样例
*/
public static void dynamicRemoveItemFromListDemo()
{ List<Bean> list = getList(); System.out.println("原始数据:");
printList(list); // 使用普通for循环遍历List删除自身元素 不报错 但结果 未必正确
normalRemoveMethod(list); // 使用高级for循环遍历List删除自身元素 报错
// try
// {
// superRemoveMethod(list);
// }
// catch (Exception e)
// {
// System.err.println("高级for循环报错:");
// e.printStackTrace();
// } // 引入參考List 遍历删除方法
// referenceRemoveMethod(list); // iterator遍历删除方法
// iteratorRemoveMethod(list); System.out.println("结果数据:");
printList(list); } /**
* 打印 List 方法
*
* @param list
*/
private static void printList(List<Bean> list)
{
for (Bean item : list)
{
System.out.print(item.getName() + " ");
}
System.out.println();
} /**
* 利用普通for循环遍历删除元素
*
* @param list
*/
private static void normalRemoveMethod(List<Bean> list)
{
for (int i = 0; i < list.size(); i++)
{
if (list.get(i).getName().equals("A"))
{
list.remove(list.get(i));
}
}
} /**
* 利用高级for循环遍历删除元素(会报异常)
*
* @param list
*/
private static void superRemoveMethod(List<Bean> list)
{
// 方法一
for (Bean item : list)
{
if (item.getName().equals("A"))
{
list.remove(item);
}
}
} /**
* 有效的for循环遍历删除元素(正常 达到预期目的)
*
* @param list
*/
private static void referenceRemoveMethod(List<Bean> list)
{
List<Bean> referenceList = new ArrayList<Bean>();
referenceList.addAll(list); for (int i = 0; i < referenceList.size(); i++)
{
if (referenceList.get(i).getName().equals("A"))
{
list.remove(referenceList.get(i));
}
}
} /**
* 使用Iterator的方式也能够顺利删除和遍历
*/
public static void iteratorRemoveMethod(List<Bean> list)
{
Iterator<Bean> it = list.iterator();
while (it.hasNext())
{
Bean student = it.next();
if (student.getName().equals("A"))
it.remove();
}
} /**
* 获取List方法
*
* @return
*/
private static List<Bean> getList()
{
List<Bean> list = new ArrayList<Bean>(); for (int i = 0; i < 50; i++)
{
Bean item = new Bean();
int j = i + new Random().nextInt();
if (j % 3 == 1)
{
item.setName("A");
}
else if (j % 3 == 2)
{
item.setName("B");
}
else
{
item.setName("C");
} list.add(item);
}
return list;
} }
Java动态 遍历List 时删除List特征元素 异常问题 及解决方案总结的更多相关文章
- Java 遍历集合时产生的ConcurrentModificationException异常
前几天做Java实验的时候,打算用foreach遍历一个ArrayList集合,并且当集合中的某个元素符合某个值时删除这个元素.写完运行时抛出了ConcurrentModificationExcept ...
- Java数组超出范围时如何处理多个异常?
在Java编程中,数组超出范围时如何处理多个异常? 此示例显示如何使用System类的System.err.println()方法处理多个异常方法. package com.yiibai; publi ...
- Java 遍历Map时 删除元素
Java代码 package,,,,,,,,,,,==){ System.out.println("delete this: "+key+" = "+key ...
- 遍历list时删除元素的正确做法
我们往往会遇到需要删除list中满足条件的元素.举例: List<string> list_str =new List<string>() { "A",&q ...
- java 集合list遍历时删除元素
本文探讨集合在遍历时删除其中元素的一些注意事项,代码如下 import java.util.ArrayList; import java.util.Iterator; import java.util ...
- java list集合遍历时删除元素
转: java list集合遍历时删除元素 大家可能都遇到过,在vector或arraylist的迭代遍历过程中同时进行修改,会抛出异常java.util.ConcurrentModification ...
- Java遍历时删除List、Set、Map中的元素(源码分析)
在对List.Set.Map执行遍历删除或添加等改变集合个数的操作时,不能使用普通的while.for循环或增强for.会抛出ConcurrentModificationException异常或者没有 ...
- java集合类遍历删除方法测试以及使用场景记录
package test0; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java. ...
- 【Java面试题】List如何一边遍历,一边删除?
这是最近面试时被问到的1道面试题,本篇博客对此问题进行总结分享. 1. 新手常犯的错误 可能很多新手(包括当年的我,哈哈)第一时间想到的写法是下面这样的: public static void mai ...
随机推荐
- QT实现透明效果的按钮
QPushButton { color: rgb(0,88,152) background-color: rgba(97%,80%,9%,50%)}
- MySQL Replication Error 处理一例
故障现象 MySQL slave status详情 mysql> show slave status\G *************************** 1. row ********* ...
- jquery选择指定元素之外的所有元素
最近的项目中有这么一个需求,点击一排图片中的任意一张后底部弹出一个对话框,要求点击任意地方隐藏对话框 这个时候用not()显然是不现实的,用closest()可以实现差不多的功能 <!DOCTY ...
- (转)android客户端从服务器端获取json数据并解析的实现代码
今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 复制代码 ...
- Objective-C 字典、可变字典
字典相当于c++ stl中的map 字典NSDictionary #import <UIKit/UIKit.h> #import "AppDelegate.h" int ...
- Oracle 账户被锁定
哎 每次安装oracle的时候总是忘了将用户解锁,结果就蛋疼了,从网上找到一个简单的解决方案 在CMD命令输出如下: sqlplus /nolog alert user system account ...
- hdu1272并查集入门
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- SharpZipLib 压缩文档下载
using ICSharpCode.SharpZipLib.Zip; Response.Clear(); Response.ClearContent(); Response.ClearHeaders( ...
- WP Super Cache 安装与设置方法
1.首先,永久连接不能使用默认格式 2.修改永久链接格式,中文推荐采用 /%post_id%.html (这下你知道我的.orz哪里来了吧) 如果你和我一样蛋疼愿意为每篇文章写一个英语的post sl ...
- 在子jsp页面中调用父jsp中的function或父jsp调用子页面中的function
项目场景: A.jsp中有一个window,window里嵌入了一个<iframe>,通过<iframe>引入了另一个页面B.jsp.在B.jsp中的一个function中需要 ...