java中List遍历删除元素

删除末尾几个元素 

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一定会被保留下来。


————————————————
版权声明:本文为CSDN博主「github_2011」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/github_2011/article/details/54927531

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值