错误的方式1
原因:数组越界,漏元素。删除元素之后未改变相应角标,遍历到最后一个的时候就会找不到,抛出这个异常。
for(int i = 0, len = list.size(); i < len; i++){
if(list.get(i) == 1) {
list.remove(i);
}
}
错误的方式2
删除元素后继续循环会报错误信息ConcurrentModificationException,因为元素在使用的时候发生了并发的修改,导致异常抛出。但是删除完毕马上使用break跳出,则不会触发报错
for(String x:list){
if(x.equals("del"))
list.remove(x);
}
正确方式1
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String i = iterator.next();
if("a".equals("a")){
iterator.remove(); //这里要使用Iterator的remove方法移除当前对象,如果使用List的remove方法,则同样会出现ConcurrentModificationException
}
正确方式2
List<String> urls = this.getUrls();
// 使用方法引用删除urls中值为"null"的元素
urls.removeIf("null"::equals);
在JDK1.8中,Collection以及其子类新加入了removeIf方法,作用是按照一定规则过滤集合中的元素。
方法引用是也是JDK1.8的新特性之一。方法引用通过方法的名字来指向一个方法,使用一对冒号 :: 来完成对方法的调用,可以使语言的构造更紧凑简洁,减少冗余代码。