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 ...
随机推荐
- telnet IP不通/sybase central工具无法连接到数据库
问题描述:客户端sybase central工具无法连接到数据库 服务端操作系统:RHEL5.8_x64,安装sybase-ASE15.7,端口号4112 IP:192.168.1.220 hos ...
- CentOS 6.8编译安装httpd2.2.31+MySQL5.6.31+PHP5.3.27
CentOS 6.8编译安装httpd2.2.31+MySQL5.6.31+PHP5.3.27 说明: 操作系统:CentOS 6.8 32位 准备篇: 一.系统约定 软件源代码包存放位 ...
- HTML与CSS入门——第十三章 使用框架
知识点: 1.建立框架集的方法 2.在框架和窗口之间链接的方法 3.使用内联框架的方法 13.1 什么是框架: 框架是浏览器窗口中的一个矩形区域,每个框架显示的是一个完整的页面. 作者不建议使用框架, ...
- 关于asp.net的<%#%>的一些总结
一.说明 asp特有的控件在前台绑定数据的语法,且必须要调用该控件的DataBind()方法才执行,也可以整个页面数据绑定. 二.注意 1.并不是只有服务器控件才可以使用该语法,当整个页面调用this ...
- javascript---String与Arry
var str = "liuzhanqi"; document.write(str["length"]);//等价str.l ength var str = s ...
- CSS 盒子模型(转)
CSS中, Box Model叫盒子模型(或框模型),Box Model规定了元素框处理元素内容(element content).内边距(padding).边框(border) 和 外边距(marg ...
- FpSpread添加标注
先看效果 实现: FarPoint.Web.Spread.StyleInfo Errorcss = new FarPoint.Web.Spread.StyleInfo(); Errorcss.Bord ...
- String StringBuffer StringBuilder (转)
转自:http://www.iteye.com/topic/522167 众所周知,String是由字符组成的串,在程序中使用频率很高.Java中的String是一个类,而并非基本数据类型. 不过她却 ...
- 点击推送消息跳转处理(iOS)
当用户点击收到的推送消息时候,我希望打开APP,并且跳转到对应的界面,这就需要在AppDelegate里面对代理方法进行处理. 当用户点击推送消息打开APP的时候会调用 - (BOOL)applica ...
- Array.prototype.sort()
sort() 方法对数组的元素做原地的排序,并返回这个数组.默认按照字符串的Unicode码位点(code point)排序. 语法 arr.sort([compareFunction]) 参数 co ...