跳转至

List

循环

list循环遍历有三种:for循环、增强for循环、iterator遍历

一、for循环

使用for循环进行遍历删除,有一个问题,删除某个元素之后,list的大小发生了变化,索引也跟着变化,这就回导致你在遍历的时候漏掉某些元素,普通的for循环只适合删除特定位置的一个元素时使用,但不适合循环删除多个元素时使用

二、增强for循环

使用增强for循环,会报一个异常信息:ConcurrentModificationException,是因为调用list.remove()方法导致modCount和expectedModCount的值不一致,使异常抛出。但如果你删除完毕马上使用break跳出,则不会触发报错。

三、iterator遍历

Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
      String s = iterator.next();
      if(!s.contains("del"){
            iterator.remove();
      }
}
使用iterator遍历可以正常的循环删除(只适用于单线程)

在多线程中,使用iterator时需要,加synchronized或者Lock进行同步;或者使用并发容器CopyOnWriteArrayList代替ArrayList和Vector

如果循环删除list中的特定的一个元素,可以使用for、增强for、iterator任意一种

如果需要循环删除list中的多个元素,应该使用迭代器iterator方法


遇到的问题

1.java.lang.UnsupportedOperationException

在对List进行操作时报错java.lang.UnsupportedoperationException

是调用Arrays.asList()产生的List的add、remove方法时报的异常,这是由Arrays.asList()返回的是Arrays的内部类ArrayList,而不是java.util.ArrayList。Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList,remove、add等方法AbstractList中是默认throw UnsupportedOperationException而且不做任何操作。java.util.ArrayList重写了这些方法而Arrays的内部类ArrayList没有重写,所以会抛出异常。