首先。这是一个极其简单的问题,大牛可忽略。新手可能会遇到,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特征元素 异常问题 及解决方案总结的更多相关文章

  1. Java 遍历集合时产生的ConcurrentModificationException异常

    前几天做Java实验的时候,打算用foreach遍历一个ArrayList集合,并且当集合中的某个元素符合某个值时删除这个元素.写完运行时抛出了ConcurrentModificationExcept ...

  2. Java数组超出范围时如何处理多个异常?

    在Java编程中,数组超出范围时如何处理多个异常? 此示例显示如何使用System类的System.err.println()方法处理多个异常方法. package com.yiibai; publi ...

  3. Java 遍历Map时 删除元素

    Java代码   package,,,,,,,,,,,==){ System.out.println("delete this: "+key+" = "+key ...

  4. 遍历list时删除元素的正确做法

    我们往往会遇到需要删除list中满足条件的元素.举例: List<string> list_str =new List<string>() { "A",&q ...

  5. java 集合list遍历时删除元素

    本文探讨集合在遍历时删除其中元素的一些注意事项,代码如下 import java.util.ArrayList; import java.util.Iterator; import java.util ...

  6. java list集合遍历时删除元素

    转: java list集合遍历时删除元素 大家可能都遇到过,在vector或arraylist的迭代遍历过程中同时进行修改,会抛出异常java.util.ConcurrentModification ...

  7. Java遍历时删除List、Set、Map中的元素(源码分析)

    在对List.Set.Map执行遍历删除或添加等改变集合个数的操作时,不能使用普通的while.for循环或增强for.会抛出ConcurrentModificationException异常或者没有 ...

  8. java集合类遍历删除方法测试以及使用场景记录

    package test0; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java. ...

  9. 【Java面试题】List如何一边遍历,一边删除?

    这是最近面试时被问到的1道面试题,本篇博客对此问题进行总结分享. 1. 新手常犯的错误 可能很多新手(包括当年的我,哈哈)第一时间想到的写法是下面这样的: public static void mai ...

随机推荐

  1. 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第7章 动态规划

    由于种种原因(看这一章间隔的时间太长,弄不清动态规划.分治.递归是什么关系),导致这章内容看了三遍才基本看懂动态规划是什么.动态规划适合解决可分阶段的组合优化问题,但它又不同于贪心算法,动态规划所解决 ...

  2. [RxJS] Stopping a Stream with TakeUntil

    Observables often need to be stopped before they are completed. This lesson shows how to use takeUnt ...

  3. 关闭程序 提示 C#

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) { DialogResult dr = MessageBox ...

  4. 黑马程序员——String类

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  5. FineUI模拟树下拉列表

    模拟树的下拉列表 很多时候,我们希望在下拉列表中显示简单树状的层次结构,在菜单设置.机构设置等场景下这个需求尤为突出.也是基于项目需求的考虑,FineUI增加了模拟树的下拉列表的功能,显示效果如下所示 ...

  6. Qt添加窗口背景图片、Label图片显示、、Label文字显示

    一.添加窗口背景图片 重写MainWindow绘制事件 void MainWindow::paintEvent(QPaintEvent *event) { QPainter painter(this) ...

  7. windbg vmware win7联机调试环境搭建

    接下来设置虚拟机启动模式,可以直接设置现在的虚拟机启动项为debug模式 或者直接新建一个启动项目 bcdedit /dbgsettings {serial [baudrate:value][debu ...

  8. angularjs如何在ng-repeat过程中控制字符串长度超过指定长度后面内容以省略号显示

    angular.module('ng').filter('cut', function () { return function (value, wordwise, max, tail) { if ( ...

  9. 16-js-缓冲运动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. mysql函数date_format统计刷选按年月日统计的数据

    /*原型*/ SELECT count(did) AS sum, date_format(releasetime, '%Y-%m-%d') AS releasetime FROM hengtu_dem ...