java List remove 时的小问题_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java List remove 时的小问题

java List remove 时的小问题

 2011/11/17 9:37:27  suihr  http://suihr.iteye.com  我要评论(0)
  • 摘要:From:http://hi.baidu.com/xiami9910/blog/item/caeda23621e560d8a2cc2b51.htmlimportjava.util.*;publicclassobject{publicstaticvoidmain(String[]args){Stringstr1=newString("abcde");Stringstr2=newString("abcde");Stringstr3=newString("abcde")
  • 标签:list Java 问题

?

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);

? }

?}

}

?

发表评论
用户名: 匿名