1、实际项目书写中,踩了一个List.remove()的坑,再次记录一下
for(int i=0;i<list.size();i++) {
if(list.get(i)%2!=0) {
list.remove(i);
}
}
总结:上面这段代码看起来没有问题,但是实际上remove()方法删除某个元素后,后面的元素都往前移动了一位,而你的索引+1,所以实际访问的元素相对于删除的元素中间间隔了一位。【比如list.remove(0)之后,执行i++,那么此时的i变为1,下次的遍历会导致list[0]的数据未遍历出错】
正确示例
//采用倒叙的遍历,可以避免上述的问题
for(int i=list.size()-1;i>=0;i--) {
if(list.get(i)==1) {
list.remove(i);
}
}
//让i从头开始遍历也可
for(int i=0;i<list.size();i++) {
if(list.get(i)==1) {
list.remove(i);
i--;//在元素被移除掉后,进行索引后移
}
}
后续的性能优化,以及深入 在进行补充