当前位置 : 主页 > 编程语言 > java >

java中List遍历删除元素

来源:互联网 收集:自由互联 发布时间:2022-06-23
删除末尾几个元素 import java.util.LinkedList; import java.util.List; public class TestList { public static void main(String[] args) { // TODO Auto-generated method stub ListString test = new LinkedListString(); test.add("0"); test.a

删除末尾几个元素 

import java.util.LinkedList;
import java.util.List;

public class TestList {

public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> test = new LinkedList<String>();
test.add("0");
test.add("1");
test.add("2");
test.add("3");
test.add("4");
test.add("5");
for (int i = 0; i < 3; i++) {
test.remove(test.size() - 1);
}
for (int i = 0; i < test.size(); i++) {
System.out.println(test.get(i));
}
}

}

遍历删除元素
众所周知,java中对集合的操作属于基础内容,开发Android时间长了,这些基础有些也开始遗忘了,故在此做个总结,方便日后使用。

先说结论:

List集合的遍历删除建议使用迭代器遍历删除操作。

这是List接口中的方法,List集合调用此方法可以得到一个迭代器对象(Iterator)。

for example:

//准备数据
List<Student> list = new ArrayList<>();
list.add(new Student("male"));
list.add(new Student("female"));
list.add(new Student("female"));
list.add(new Student("male"));

//遍历删除,除去男生
Iterator<Student> iterator = list.iterator();
while (iterator.hasNext()) {
Student student = iterator.next();
if ("male".equals(student.getGender())) {
iterator.remove();//使用迭代器的删除方法删除
}
}

这种使用迭代器遍历、并且使用迭代器的删除方法(remove()) 删除是正确可行的,也是开发中推荐使用的。

误区:

如果将上例中的iterator.remove(); 改为list.remove(student);将会报ConcurrentModificationException异常。

这是因为:使用迭代器遍历,却使用集合的方法删除元素的结果。

再说for循环:

总体来说,不建议使用高级for循环(增强for循环)遍历删除/增加操作。

原因就是可能会报ConcurrentModificationException异常。

说可能是比较准确的,可能会报,也可能不报。

总结干货:

1.使用高级for循环遍历删除/增加元素时,如果在某次循环的过程中进行了删除或者是增加元素的操作,使用break或者return语句结束了循环操作,不报异常。

2.使用高级for循环遍历删除/增加元素时,除了1这种情况之外,必报ConcurrentModificationException异常。

验证:

1.break/return 语句结束循环

//准备数据
List<Student> list = new ArrayList<>();
list.add(new Student("male"));
list.add(new Student("female"));
list.add(new Student("female"));
list.add(new Student("male"));

//遍历删除增强for循环除去男生
for (Student student : list) {
if ("male".equals(student.getGender())) {
list.remove(student);//使用集合的删除方法删除
break;//或者return
}
}
Log.d("操作结果:", list.toString());

Log日志为:操作结果:: [Student{gender='female'}, Student{gender='female'}, Student{gender='male'}]

2.其它情况:

        //高级for遍历删除元素,没有break/return
        for(Student student : list){
            if ("male".equals(student.getGender())) {
                list.remove(student);//使用集合的删除方法删除
            }
        }

普通for循环:

普通for循环遍历删除也是可行的,上代码:

//准备数据
List<Student> list = new ArrayList<>();
list.add(new Student("male"));
list.add(new Student("male"));
list.add(new Student("female"));
list.add(new Student("female"));
list.add(new Student("male"));

//普通for循环遍历删除
for (int i = 0; i < list.size(); i++) {
Student student = list.get(i);
if ("male".equals(student.getGender())) {
list.remove(i);//使用集合的删除方法删除
i--;//★★★★★ 角标减一
}
}
Log.d("普通for操作结果:", list.toString());

Log日志为:普通for操作结果:: [Student{gender='female'}, Student{gender='female'}]
这种使用普通for循环遍历删除的方法是可行的,但是如果每次删除一个元素之后忘记了将角标减一的话可能会出问题的。

问题:满足条件需要删除的元素没有完全删掉

    

//准备数据
List<Student> list = new ArrayList<>();
list.add(new Student("male"));
list.add(new Student("male"));
list.add(new Student("female"));
list.add(new Student("female"));
list.add(new Student("male"));

//普通for循环遍历删除
for (int i = 0; i < list.size(); i++) {
Student student = list.get(i);
if ("male".equals(student.getGender())) {
list.remove(i);//使用集合的删除方法删除
//i--;//★★★★★ 角标不减一
}
}
Log.d("普通for操作结果:", list.toString());

Log日志为:普通for操作结果:: [Student{gender='male'}, Student{gender='female'}, Student{gender='female'}]
结果证明有一个男性的学生没有被删掉,只要有相邻元素A和B都满足删除条件,那么A被删掉,B一定会被保留下来。


网友评论