场景:
最近在项目中遇到一个使用ArrayList删除满足条件的数据时,某些满足条件的却没有删除掉的情况,针对该问题进行了对ArrayList的一点深入的学习。
①ArrayList 的底层数据结构实现
查看源码可以看出ArrayList底层数据结构是用数组实现的, 默认数组容量为 10,当添加数据的容量超过了数组的长度,将会自动扩充容量,具体怎么扩充,如下:
②ArrayList 添加、删除 实现
add:
remove:
③使用for 循环 进行删除出现BUG的原因
栗子:
测试结果:
从结果中可以看出满足年龄条件为20 的记录并没有删除完毕。为什么会出现这种情况呢,看看 remove() 方法的实现我们就能知道答案:
当数组根据下标进行删除之后,数据进行了移位操作,所以当前 index 的后一个数据总会被过滤掉,不能被删除,画个图对移位操作进行解释:
④解决方案
针对③的情况,我们知道,是因为在对数组进行删除时,数据进行了移位,针对这个原因,我们可以有两种解决方案:
way1:删除操作后,对数组下标进行减1 操作
way2:使用 Iterator 进行对ArrayList 进行迭代 删除操作
再来看看输出的结果是否满足我们的期望:
欧啦,结果是我想要的!