java中ArrayList的遍历删除元素(一)

 

有如下需求,例如:
有如下一个ArrayList,需要删除其中字符串有 "2" 的元素

java中ArrayList的遍历删除元素(一)java中ArrayList的遍历删除元素(一)

 

博主最开始学习java开发时,最先接触到的是简单for循环,所以最开始实现以上需求的编码为:

java中ArrayList的遍历删除元素(一)java中ArrayList的遍历删除元素(一)

但是,得到的结果却为:

java中ArrayList的遍历删除元素(一)java中ArrayList的遍历删除元素(一)

问题产生:
明显,上面集合遍历删除元素的方法并不正确,以至于元素 "2-1" 并未删除掉;
那么,造成如上结果的原因是啥呢?博主为了方便理解,画了如下一张图:

java中ArrayList的遍历删除元素(一)java中ArrayList的遍历删除元素(一)

 

 

从上图可以看出,删除了第一个满足条件的元素时,i 对应的集合下标为 2;

这个时候删掉元素 "1-2" 后,list中元素下标为2的元素变为了 "2-1";

for循环接着往下走,i变成了3,再次获得的元素为下标是 3 的元素,即 "3" ;就会导致元素 "2-1" 被漏掉,从而得到上述结果

 

解决方法:
从上述步骤看,问题出在,删掉下标为2的元素之后,后续元素下标都会减1,导致循环再次执行时,会略掉删除元素后下标为2(删除前下标为3)的元素;

那么可以在元素删除成功后,将 i-1 即可
代码以及结果如下:

java中ArrayList的遍历删除元素(一)java中ArrayList的遍历删除元素(一)

java中ArrayList的遍历删除元素(一)java中ArrayList的遍历删除元素(一)

 

方法拓展:
除了以上方法,使用简单for循环的倒序删除也可以解决上述问题,代码如下:

java中ArrayList的遍历删除元素(一)java中ArrayList的遍历删除元素(一)

 

为何倒序删除不会产生上述问题呢?让我们再看一张图

java中ArrayList的遍历删除元素(一)java中ArrayList的遍历删除元素(一)

从上图可以看出,由于是倒序循环,会先删除元素 "2-1";

这个时候,下标产生变化的元素为元素"2-1"之后的元素,其之后的元素在前序步骤就已遍历过,所以不会对元素"2-1"之前的(未遍历的)元素产生影响