当我们想从List集合中移除某些元素的时候,一般会想到List集合中的remove方法,所以有的人会起初使用如下的方式从集合中移除元素:
List<Integer> listInteger = new ArrayList<Integer>();
listInteger.add(1);
listInteger.add(2);
listInteger.add(3);
listInteger.add(4);
System.out.println(listInteger);
for(Integer i:listInteger){
if(i == 1 || i == 3){
listInteger.remove(i);
}
}
System.out.println(listInteger);
上面的代码表示在一个listInteger集合中,添加四个元素,然后循环该集合,如果元素的值为1或者3(此处存在自动拆箱将Integer拆箱为int类型做比较)就需要移除掉该元素从集合中,但是这种做法得不到效果反而会报错,异常信息如下所示:
java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:996)
at com.java.lee.ReferenceTest.main(ReferenceTest.java:39)
出现这个错误的原因是因为移除元素的方式不对,那么如何解决从List中移除元素这种问题呢?
下面给出两种解决方法:
方法一:将要移除的元素放到一个新的List集合中,然后从原有的集合中调用removeAll(Collection<?> c)
方法 这样可以成功移除,示例代码如下:
List<Integer> listInteger = new ArrayList<Integer>();
listInteger.add(1);
listInteger.add(2);
listInteger.add(3);
listInteger.add(4);
System.out.println(listInteger);
List<Integer> removeList = new ArrayList<Integer>();
for(Integer i:listInteger){
if(i == 1 || i == 3){
//listInteger.remove(i);
removeList.add(i);
}
}
listInteger.removeAll(removeList);
System.out.println(listInteger);
需要注意的是上述的removeAll
方法的参数不可以为null
,所以如果要使用该方法首先判断一下参数否为为removeList!=null && removeList.size()>0
运行结果如下所示:
[1, 2, 3, 4]
[2, 4]
方法二:使用Iterator
来进行迭代,在该迭代中使用remove()
方法,示例代码如下:
List<YmVo> list = new ArrayList<YmVo>();
YmVo vo = new YmVo();
vo.setYmzl("01");
vo.setYmjc("1");
list.add(vo);
YmVo vo1 = new YmVo();
vo1.setYmzl("02");
vo1.setYmjc("1");
list.add(vo1);
for (YmVo v:list) {
System.out.print(v.getYmzl()+ " ");
}
System.out.println();
System.out.println("--------------------------------");
for (Iterator<YmVo> iter = list.listIterator(); iter.hasNext(); ) {
YmVo a = iter.next();
if ("01".equals(a.getYmzl())) {
iter.remove();
}
}
for (YmVo v:list) {
System.out.println(v.getYmzl()+ " ");
}
public class YmVo {
private String ymzl;
private String ymjc;
public String getYmzl() {
return ymzl;
}
public void setYmzl(String ymzl) {
this.ymzl = ymzl;
}
public String getYmjc() {
return ymjc;
}
public void setYmjc(String ymjc) {
this.ymjc = ymjc;
}
}
运行结果如下:
01 02
02
上面是我关于从 List集合中移除元素的两种方法实践的总结。