`

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() 方法的性能效率

    在Java编程语言中,`List.removeAll()`方法是一个非常实用的函数,它允许我们从列表中一次性移除所有指定元素。这个方法是集合框架的一部分,它提供了高效的方式来进行元素的删除操作。本文将深入探讨`removeAll()`...

    javaList用法

    "javaList用法详解" Java 中的 List 用法是指在 Java 编程语言中使用 List 集合的方法和实现方式。List 集合是 Java 中的一种常用的集合类型,提供了许多实用的方法和实现类,下面将详细介绍 List 用法和实例。 ...

    java计算同一个list中是否有相同的值

    ### Java 计算同一 List 中是否有相同值 在 Java 编程中,判断一个 `List` 中是否存在重复元素是一项常见的需求。特别是在数据处理、验证或分析等场景中,确保数据的唯一性对于维持数据完整性至关重要。 #### 核心...

    java list 过滤

    当我们需要从一个`List`中筛选出满足特定条件的元素时,Java提供了多种方式来实现这一功能。这篇博客“java list 过滤”可能深入探讨了这些方法。 首先,Java集合框架中的`List`接口是有序的、允许重复元素的集合。...

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

    JAVA LIST接口的REMOVE重载方法调用原理解析 JAVA中的LIST接口提供了多个重载的REMOVE方法,分别传入参数为索引index、Object、Integer等,这些重载方法的调用原理是什么?在实际开发中,我们经常会遇到这种情况,...

    java的list取之方法

    当多个线程同时对`List`进行修改时,可能会抛出`ConcurrentModificationException`异常。为了解决这个问题,可以使用`CopyOnWriteArrayList`或者手动同步代码块。 ### 总结 本篇介绍的是Java中List的基本操作以及...

    JavaList.rar_javalist

    在Java编程语言中,`List`接口是集合框架的一个重要组成部分,它代表了一种有序的、可变大小的集合。`List`接口继承自`Collection`接口,它提供了额外的功能,比如按照索引访问元素、保持元素的顺序以及允许重复元素...

    javaList的定义和方法

    - `List`接口中的方法`add`, `remove`, `set`等操作可能会影响迭代器,因此在遍历列表时应避免修改列表,除非使用`Iterator`的`remove()`方法。 - `List`接口还提供了一些其他的方法,如`contains()`, `indexOf()`, ...

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

    在使用`remove()`方法时,需要注意一些重要的细节以避免潜在的问题和错误。下面将详细介绍`List.remove()`方法的两种用法及其注意事项。 首先,`remove(int index)`方法用于根据提供的索引从列表中移除一个元素。...

    Java List集合的应用.rar

    Java List集合是Java编程语言中一个非常重要的数据结构,它属于集合框架的一部分,主要用于存储一组有序的、可重复的对象。List接口提供了许多方法,使得在处理列表数据时具有很高的灵活性和效率。在这个“Java List...

    javalist.zip_list集合 java

    "javalist.zip_list集合 java"这个标题暗示我们将探讨Java中的List集合以及它的应用。描述中提到“java中集合list的应用非常重要”,这确实不假,因为List在处理有序数据时具有广泛的应用场景。 List接口位于java....

    JAVA中List的增删改查

    在Java编程语言中,List接口是集合框架的重要组成部分,它代表了一个有序的元素序列,允许重复元素,并且保持插入顺序。对于初学者来说,理解如何在List中进行增删改查操作是掌握Java集合框架的基础。本文将详细介绍...

    Java List简介_动力节点Java学院整理

    Java List 是一种集合框架中的接口,它代表了一个有序的、可重复的元素序列。与数组类似,List 可以通过角标访问元素,但不同的是,List 的大小是可变的,可以在运行时动态地添加或删除元素。下面我们将详细讨论 ...

    Java-Mail-list.zip_JAVA list通讯录

    在Java编程领域,"Java-Mail-list.zip_JAVA list通讯录"是一个示例项目,它展示了如何使用Java语言来实现一个基本的通讯录系统。这个项目包含添加联系人、搜索联系人、删除联系人以及查询联系人等核心功能,是学习...

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

    如果在遍历过程中需要移除元素,必须使用`it.remove()`,直接调用`list.remove()`会导致并发修改异常(ConcurrentModificationException)。 ### 第二种:增强型for循环(foreach) ```java for (A a : list) { /...

    java基础--list(ArrayList、LinkedList、匿名类).docx

    【Java基础——List接口详解(ArrayList、LinkedList、匿名类)】 在Java编程中,List接口是集合框架的重要组成部分,提供了有序存储元素的功能。ArrayList和LinkedList是List接口的两种主要实现,它们各有优缺点,...

    Java简单实现农夫过河问题示例

    Java简单实现农夫过河问题示例 农夫过河问题是计算机科学中的一种经典问题,旨在解决如何将农夫、鱼、狗、猫等物品从一岸运送到另一岸的问题。解决这个问题需要使用算法和数据结构来实现。下面将从Java简单实现农夫...

    java中List的用法和实例详解

    在Java编程语言中,List接口是集合框架的重要组成部分,它属于Collection接口的子接口。List接口主要用于存储有序的、可重复的元素序列。与Set不同,List允许元素重复,并且保持插入时的顺序。本篇将详细介绍Java中...

    经典java小程序源代码合集

    这个“经典java小程序源代码合集”是为Java初学者准备的宝贵资源,它包含了一系列在学习过程中可能会遇到的经典示例,有助于深入理解Java语言的核心概念。 首先,让我们探讨Java的基础知识。Java程序由类(class)...

Global site tag (gtag.js) - Google Analytics