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 ...
随机推荐
- [原创]旧事重提:只配置参数实现OAuth2登录
其实这个组件写出来很长时间了,有几个月吧,一直在 MrHuo工作室 上放着,一直说要整理,太忙没时间. 另外,关于OAuth2的一些基础内容还请从网上找找资料,太多了,写的累赘. 废话不多说,先上图 ...
- Json部分知识(前台显示格式、Json-lib日期处理)
1,Json格式用于datagrid数据显示 easyui前台显示数据可以使用JSONObject,也可以使用JSONArray.但是如果需要在datagrid表格中进行数据显示,只能使用JSONOb ...
- hdu1406
一道很水很水的题!!!!!!!!!! #include<iostream> using namespace std; int main(){ int num1,num2,i,k,j,sum ...
- ANSI与UINCODE编码
简要说明: ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符. Uincode(统一码.万国码.单一码)是计算机科学领域里的一项业界标 ...
- (转) Resource file and Source file
基本上是这样的,Sourcefile文件夹里面放的是CPP文件这些,Resourcefile文件夹是资源文件夹,里面可以放你程序里需要的资源,包括图标,对话框,图片等等:对应的文件如下: Source ...
- 前端jquery实现点击图片弹出大图层(且滚动鼠标滑轮图片缩放)
<img src="{$vo.photo}" height="50px" onclick="showdiv({$i});"> & ...
- Jasper_mainReport_excel html pdf 主报表中常用属性
jasper中,excel , html, pdf 一般可以使用相同的主报表和子报表.需要在主报表中添加不同格式对应的属性.导出不同格式的报表,编译器会将相应的属性应用到对应的报表格式中. 常用属性如 ...
- Autolayout-VFL语言添加约束-备
一.VFL语言简介 VFL(Visual format language)语言是苹果为了简化手写Autolayout代码所创建的专门负责编写约束的代码.为我们简化了许多代码量. 二.使用步骤 使用步骤 ...
- NSString、NSData、char* 类型之间的转换-备
1. NSString转化为UNICODE String: (NSString*)fname = @“Test”; char fnameStr[10]; memcpy(fnameStr, [fname ...
- 一种针对虚拟机的应用软件License认证方法
由于虚拟机的硬件信息可以随意修改,使得虚拟机可能具有相同的硬件信息,在传统的应用软件License认证方式中会导致License认证漏洞.本专利提供了一种有效的解决方法. 文/王宏财 目 前,云计算的 ...