一个 ArrayList 的集合,删除部分指定的元素,看似一个很简单的需求,却很容易出现问题。
public class Test2 {
@Test
public void test() {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("B");
list.add("C");
list.add("A");
list.add("F");
list.add("B");
list.add("E");
System.out.println(list);
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
if (StringUtils.equals(s,"B")) {
list.remove(i);
}
}
System.out.println(list);
}
}
控制台输出:
[A, B, B, C, A, F, B, E]
[A, B, C, A, F, E]
为什么 A 与 C 之间,两个 B,只有一个被移除了?
ArrayList底层用的是数组实现,当第一个 B 被移除后,数组长度由8变为了7,但 i 的值没有做相应的改变,导致第一 B 后的元素,没有参与校验,就向后执行了
优化方式 1:
public class Test2 {
@Test
public void test() {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("B");
list.add("C");
list.add("A");
list.add("F");
list.add("B");
list.add("E");
System.out.println(list);
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
if (StringUtils.equals(s,"B")) {
list.remove(i);
i--;
}
}
System.out.println(list);
}
}
控制台输出:
[A, B, B, C, A, F, B, E]
[A, C, A, F, E]
优化方式 2:
public class Test2 {
@Test
public void test() {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("B");
list.add("C");
list.add("A");
list.add("F");
list.add("B");
list.add("E");
System.out.println(list);
for (int i = list.size() - 1; i >= 0; i--) {
String s = list.get(i);
if (StringUtils.equals(s,"B")) {
list.remove(i);
}
}
System.out.println(list);
}
}
优化方式 3:
public class Test2 {
@Test
public void test() {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("B");
list.add("C");
list.add("A");
list.add("F");
list.add("B");
list.add("E");
System.out.println(list);
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
if (StringUtils.equals(iterator.next(),"B")) {
iterator.remove();
}
}
System.out.println(list);
}
}
控制台输出:
[A, B, B, C, A, F, B, E]
[A, C, A, F, E]
最后
以上就是飘逸洋葱最近收集整理的关于ArrayList 循环遍历并删除指定元素的全部内容,更多相关ArrayList内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复