`

java List remove 时的小问题

阅读更多

 

From:http://hi.baidu.com/xiami9910/blog/item/caeda23621e560d8a2cc2b51.html

 

import java.util.*;

public class object {

public static void main(String[] args) {

   String str1 = new String("abcde");

   String str2 = new String("abcde");

   String str3 = new String("abcde");

   String str4 = new String("abcde");

   String str5 = new String("abcde");

   List list = new ArrayList();

   list.add(str1);

   list.add(str2);

   list.add(str3);

   list.add(str4);

   list.add(str5);

   System.out.println("list.size()=" + list.size());

   for (int i = 0; i < list.size(); i++) {

    if (((String) list.get(i)).startsWith("abcde")) {

     list.remove(i);

    }

   }

   System.out.println("after remove:list.size()=" + list.size());

}

}

 

运行结果不是:

 

list.size()=5

after remove:list.size()=0

 

居然是:

 

list.size()=5

after remove:list.size()=2

 

原因:List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素没有被读取。

 

解决方法:

 

1.倒过来遍历list

 

for (int i = list.size()-1; i > =0; i--) {

    if (((String) list.get(i)).startsWith("abcde")) {

     list.remove(i);

    }

}

 

2.每移除一个元素以后再把i移回来

 

for (int i = 0; i < list.size(); i++) {

    if (((String) list.get(i)).startsWith("abcde")) {

     list.remove(i);

     i=i-1;

 

   }

}

 

======================================================================

边遍历ArrayList边删除元素抛java.util.ConcurrentModification 

执行下列代码:

 

if (CollectionUtils.isNotEmpty(list)) {

  Iterator it = list.iterator();

  while (it.hasNext()) {

 OfferMigPlan offerMigPlan = (OfferMigPlan) it.next();

 if(setCommonAttributes(offerMigPlan)==null){

 list.remove(offerMigPlan);

  }

 }

}

 

 

抛出异常java.util.ConcurrentModification,为什么?因为我们在遍历的时候,删除了list里面的一个元素,相应的后面的元素都在list中网上进一个位置,然而在迭代器的相应位置却未删除。

 

Solution:使用Iterator.remove()方法,该方法可删除由Iterator生成的上一个元素。所以每次调用next()的时候,只需调用remove()一次。

 

if (CollectionUtils.isNotEmpty(list)) {

  Iterator it = list.iterator();

  while (it.hasNext()) {

 OfferMigPlan offerMigPlan = (OfferMigPlan) it.next();

 if(setCommonAttributes(offerMigPlan)==null){

 

  it.remove();

 list.remove(offerMigPlan);

  }

 }

}

 

分享到:
评论

相关推荐

    List.removeAll() 方法的性能效率

    List.removeAll() 方法的性能效率

    JAVA的LIST接口的REMOVE重载方法调用原理解析

    主要介绍了JAVA的LIST接口的REMOVE重载方法调用原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java list.remove( )方法注意事项

    主要介绍了Java list.remove( )方法注意事项,非常简单易懂,需要的朋友可以参考下

    java中List对象集合的遍历方法(三个)

    java中List对象集合的遍历方法 第一种: for(Iterator&lt;A&gt; it = list.iterator(); it.hasNext(); ) { .... } 这种方式在循环执行过程中会进行数据锁定, 性能稍差, 同时,如果你想在寻欢过程中去掉某个元素,只能...

    Java集合框架List接口.pdf

    Java集合框架中的List接口是一种有序的集合,它可以存储重复的元素。它是Collection接口的子接口,提供了一系列可以对列表进行操作的方法,如添加、插入、删除、获取元素等。List接口还可以通过索引访问元素,类似于...

    js中的类似于java对象List的工具List.js

    js中终于有了自己的List,类似于java中的List对象,本文件是源码,亲测有如下方法:add()、value、size()、get(index)、contains(key)、remove(index)、removeAll()。。。

    删除List中的重复值

    public static void removeDuplicate(List list) { for ( int i = 0 ; i &lt; list.size() - 1 ; i ++ ) { for ( int j = list.size() - 1 ; j &gt; i; j -- ) { if (list.get(j).equals(list.get(i))) { list....

    beiyou Java作业 -1

    _09211195_王晓_1_StudentList.java //定义StudentList类 为便于作业批改和查找,上传作业的时候,传.java文件,不要上传压缩包,一次作业可以有多个.java文件 为便于作业批改,要求源文件中的类名也需要和java...

    js模拟list和map

    javascript 模拟 java中的 List,Map js文件为 js/utils.js IE6.0 测试通过 &lt;br&gt;List: add(var obj) //添加一个元素 remove(var index) //删除一个元素 get(var index) //获取一个元素 remove...

    常见数据结构的Java实现

    list.remove(0); list.remove(1); list.set(0,"open"); number=list.size(); System.out.println("现在链表中有"+number+"个节点:"); for(int i=0;i;i++) { String temp=(String)list.get(i); System.out....

    用java编写的简单五子棋小程序

    chessclient.userpad.userList.removeAll(); chessclient.inputpad.userChoice.removeAll(); chessclient.inputpad.userChoice.addItem("所有人"); while(userToken.hasMoreTokens()){ String user=...

    java 同一用户不能同时登陆问题

    import java.util.List; import java.util.Map; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import org.apache....

    JAVA集合(List,Set,Map)

     (1) 单元素添加、删除操作: boolean add(Object o):将对象添加给集合 boolean remove(Object o): 如果集合中有与o相匹配的对象,则删除对象o (2) 查询操作: int size() :返回当前集合中元素的数量 boolean...

    java数组遍历 删除remove(示例代码)

    java数组遍历 删除remove。需要的朋友可以过来参考下,希望对大家有所帮助

    Java ArrayList

    InitArray自己编写的一个JAVA用的集合类,试试效果如何。

    java 小游戏(5子棋的实现)

    chessclient.userpad.userList.removeAll(); chessclient.inputpad.userChoice.removeAll(); chessclient.inputpad.userChoice.addItem("所有人"); while(userToken.hasMoreTokens()) { String user=(String)...

    用java做的彩票自动选号系统

    用java做的彩票自动选号系统package com.cp; import java.util.ArrayList; import java.util.Arrays;... list.remove(index); max--; } Arrays.sort(result); return result; } }

    蓝桥杯(java)最短路

    list.remove(0); for(int i=0;i;i++) { if(a==A[i].a&&daan;[A[i].b]&gt;daan[A[i].a]+A[i].value) { daan[A[i].b]=daan[A[i].a]+A[i].value; if(!used[A[i].b]) { list.add(A[i].b); num[A[i].b]++; if(num...

    Java基于列表实现(无序)词典结构(算法源码)

    List list = new List_DLNode(); Iterator P = L.positions(); while (P.hasNext()) { Position pos = (Position)P.getNext(); Entry entry = (EntryDefault) pos.getElem(); if (T.isEqualTo(entry....

    Java网络五子棋chessClient.java:客户端主程序。chessInterface.java:客户端的界面。

    chessclient.userpad.userList.removeAll(); chessclient.inputpad.userChoice.removeAll(); chessclient.inputpad.userChoice.addItem("所有人"); while(userToken.hasMoreTokens()) { String user=(String)...

Global site tag (gtag.js) - Google Analytics