正确删除list

遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题。下面主要看看以下几种遍历删除List中元素的形式:

1.通过增强的for循环删除

2.通过普通的for删除

3.通过Iterator进行遍历删除

/**  
 * 使用增强的for循环  
 * 在循环过程中从List中删除非基本数据类型以后,继续循环List时会报ConcurrentModificationException  
 */    
public void listRemove() {    
    List<Student> students = this.getStudents();    
    for (Student stu : students) {    
        if (stu.getId() == 2)     
            students.remove(stu);    
    }    
}   
/**  
 * 这种不使用增强的for循环的也可以正常删除和遍历,  
 * 这里所谓的正常是指它不会报异常,但是删除后得到的  
 * 数据不一定是正确的,这主要是因为删除元素后,被删除元素后  
 * 的元素索引发生了变化。假设被遍历list中共有10个元素,当  
 * 删除了第3个元素后,第4个元素就变成了第3个元素了,第5个就变成  
 * 了第4个了,但是程序下一步循环到的索引是第4个,  
 * 这时候取到的就是原本的第5个元素了。  
 */    
public void listRemove2() {    
    List<Student> students = this.getStudents();    
    for (int i=0; i<students.size(); i++) {    
        if (students.get(i).getId()%3 == 0) {    
            Student student = students.get(i);    
            students.remove(student);    
        }    
    }    
}  

//优化版
 /**
   *删除元素时把游标往前移动一位
 */
    public void listRemove2() {
        List<Student> students = this.getStudents();
        for (int i = 0; i < students.size(); i++) {
            if (students.get(i).getId() % 3 == 0) {
                Student student = students.get(i);
                students.remove(student);
                i--;
            }
        }
    }


/**  
 * 使用Iterator的方式可以顺利删除和遍历  
 */    
public void iteratorRemove() {    
    List<Student> students = this.getStudents();    
    System.out.println(students);    
    Iterator<Student> stuIter = students.iterator();    
    while (stuIter.hasNext()) {    
        Student student = stuIter.next();    
        if (student.getId() % 2 == 0)    
            stuIter.remove();//这里要使用Iterator的remove方法移除当前对象,如果使用List的remove方法,则同样会出现ConcurrentModificationException    
    }    
    System.out.println(students);    
}    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值