以前都是用ArrayList删除一个元素,当然是没有问题的,今天用ArrayList删除多个元素,直接就出现问题了
其实原因很简单,比如有5个元素你删除了第二个元素,那么此时你的遍历i为1数组arraylist长度变为4,此时你再去遍历i=2这个元素的时候本来应该是遍历原来arraylist的第三个元素,但是第二个删除了,后面的就依次向前移动,这样就跳过了遍历第三个元素。
解决方案:
看了很多的方法,觉得这两个最优
1.倒序遍历。使用倒序遍历,元素向前移动是不会影响arraylist的排列的
for (int i = list.size()-1; i >= 0; i--) {
try {
System.out.println(list.get(i).getName()+list.get(i).getCode());
System.out.println();
if(list.get(i).getCode()!=null){
System.out.println("开始验证"+list.get(i).getName()+list.get(i).getCode());
SecurityUtils.getSubject().checkPermission(list.get(i).getCode());
System.out.println("没有去掉"+list.get(i).getName()+"代码号为"+list.get(i).getCode());
System.out.println();
}
} catch (Exception e) {
System.out.println("去掉了!!!!"+list.get(i).getName()+list.get(i).getCode());
System.out.println();
list.remove(i);
}
}
2.使用iterator
Iterator<String> it = list.iterator();
while(it.hasNext()){
String x = it.next();
if(x.equals("del")){
it.remove();
}
}
当然,为什么说arraylist会往前移动呢,因为arraylist的底层实现是基于 数组的扩容机制 本身就是数组,所以当然会移动。