在项目开发中,我们可能往往需要动态的删除ArrayList中的一些元素。
一种错误的方式:
- for(int i = 0 , len= list.size();i<len;++i){
- if(list.get(i)==XXX){
- list.remove(i);
- }
- }
上面这种方式会抛出如下异常:
- Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
- at java.util.ArrayList.RangeCheck(Unknown Source)
- at java.util.ArrayList.get(Unknown Source)
- at ListDemo.main(ListDemo.java:20)
因为你删除了元素,但是未改变迭代的下标,这样当迭代到最后一个的时候就会抛异常咯。
可以对上面的程序进行如下改进:
- for(int i = 0 , len= list.size();i<len;++i){
- if(list.get(i)==XXX){
- list.remove(i);
- --len;//减少一个
- --i;//多谢deny_guoshou指正,如果不加会出现评论1楼所说的情况。
- }
- }
上面的代码就正确了。
下面我们再介绍一种方案:
List接口内部实现了Iterator接口,提供开发者一个iterator()得到当前list对象的一个iterator对象。
- Iterator<String> sListIterator = list.iterator();
- while(sListIterator.hasNext()){
- String e = sListIterator.next();
- if(e.equals("3")){
- sListIterator.remove();
- }
- }
上面这种也是正确的,并推荐使用第二种方案。
两种方案实现原理都差多的,第二种只是jdk封装了下。
查看ArrayList源码会发现很多方法内部都是基于iterator接口实现的,所以推荐使用第二种方案。
相关推荐
Java.util.ConcurrentModificationException 异常问题详解 ConcurrentModificationException 异常是 Java 中一个常见的异常,它发生在 Iterator 遍历集合时,集合同时被修改引起的异常。在 Java 中,集合类如 ...
在Java编程中,`ConcurrentModificationException`是一个常见的运行时异常,通常发生在多线程环境下对集合进行迭代和修改操作时。此问题的核心在于,Java的集合类(如ArrayList、LinkedList、HashSet等)并不支持...
在多线程编程中,我们经常会遇到一个运行时异常 ConcurrentModificationException。该异常通常是由于一个线程在对集合进行迭代的过程中,另一个线程修改了这个集合的结构,例如添加或删除元素。这种情况下,会出现...
ConcurrentModificationException异常是在Java编程中处理集合时经常会遇到的一个问题。当集合正在被迭代时,如果同时又对其进行修改(比如增加、删除元素等操作),就可能会触发此异常。解决这个问题的方法有很多种...
ConcurrentModificationException异常是Java中常见的运行时异常,尤其在多线程环境下对集合进行迭代时,如果另一个线程同时对集合进行修改操作,就可能会抛出这种异常。为了解决这个问题,我们有几种策略可以采取。 ...
在鸿蒙开发过程中遇到的`ConcurrentModificationException`异常问题及解决方案如下: `ConcurrentModificationException`是一个多线程环境下常见的异常。在进行迭代集合的操作时,如果尝试修改正在迭代的集合结构,...
在Java开发中,ConcurrentModificationException是一个常见的运行时异常,通常在多线程环境下对集合进行迭代和修改操作时出现。这个问题的根源在于Java集合类(比如ArrayList、HashMap等)在多线程访问时并不是线程...
在Java编程中,`java.util.ConcurrentModificationException` 是一个常见的运行时异常,通常发生在尝试并发修改集合时。这个异常的产生是由于集合类(如HashMap)的非线程安全特性,当你在一个线程中使用迭代器遍历...
在Java编程中,`ConcurrentModificationException`是一个常见的运行时异常,主要出现在多线程环境下对集合类(如List、Set、Map等)进行并发修改时。然而,这个异常不仅限于多线程环境,即使在单线程中,如果在遍历...
在多线程编程中,对集合进行迭代操作时可能会遇到ConcurrentModificationException异常,该异常是因为在迭代过程中,集合结构被其他线程修改,从而导致迭代器状态不一致,进而抛出异常。HarmonyOS或其他Java开发环境...
`java.util.ConcurrentModificationException` 是一个在 Java 中常见的运行时异常,它通常发生在多线程环境中,当一个线程正在遍历一个集合(如 `ArrayList`, `HashMap` 等),而另一个线程同时尝试修改这个集合时。...
bject[initialCapacity]; } else if (initialCapacity == 0) {...同时,需要注意在并发环境下使用ArrayList可能会遇到`ConcurrentModificationException`,应当避免在遍历过程中修改集合,或者选择线程安全的数据结构。