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时需要,加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没有重写,所以会抛出异常。