最近在做一个需求时,在将数组转成List集合进行删除操作后抛出异常。
使用的 Arrays.asList(str) 数组转成list集合,然后需要将list集合中某个值删除,但是执行完后却爆出异常java.lang.UnsupportedOperationException。
代码示例:
String[] str = {"a", "b", "c"};
List<String> list = Arrays.asList(str);
for (String s : list) {
if ("a".equals(s)) {
list.remove(s);
}
}
原因分析:在使用Arrays.asList(str)返回的是java.util.Arrays中的一个私有静态内部类,java.util.Arrays.ArrayList,而不是java.util.ArrayList类。java.util.Arrays.ArrayList类中的方法中没有add()和remove()方法,在执行增加和删除操作时,会抛出异常
解决:
String[] str = {"a", "b", "c"};
//将其转成ArrayList集合
ArrayList<String> list=new ArrayList<>(Arrays.asList(str));
for (String s : list) {
if ("a".equals(s)) {
list.remove(s);
}
}
但是在执行完之后,有报错了:java.util.ConcurrentModificationException,这又是为什么呢,我又去百度查了一下原因,原来是因为在增强for循环中,是没有remove这个方法的,之所以失败是由于java集合中的快速失败(fail-fast)机制产生的,在使用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了增删改,就会抛出该异常。
解决方案:使用普通的for循环,或者 使用迭代器中的删除方法
for (int i = 0; i < list.size(); i++) {
if("a".equals(list.get(i))){
list.remove(list.get(i));
}
}
Iterator<String> it = list.iterator();
while(it.hasNext()){
if("a".equals(it.next())){
it.remove();
}
}