我想遍历一个ArrayList可以用for(int i=0;i<list.size();i++){list.get(i)}或者用for each即(for(Object o:list){sout(o)})
那么我想添加一个元素就可以直接:list.add(o);但是要注意的是:ArrayList和数组一样在内存中的存储是连续的,因此存储地址顺序向后添加
那么我想更改其中的一个元素怎么办?ArrayLikst 中有个set函数set(要更改的下标,要改成的内容);
那么我想删除一个元素呢?可能会说直接list.remove(o)或者list.remove(i);这只是删除一个元素,那么我想删除多个呢?用循环找出满足条件的元素然后remove,这是不对的。
其中有以下情况,其中做后一种为正确的
遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题。下面主要看看以下几种遍历删除List中元素的形式:
1.通过增强的for循环删除符合条件的多个元素
2.通过增强的for循环删除符合条件的一个元素
3.通过普通的for删除删除符合条件的多个元素
4.通过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进行遍历删除,但删除之后马上就跳出的也不会出现异常
- */
- public void listRemoveBreak() {
- List<Student> students = this.getStudents();
- for (Student stu : students) {
- if (stu.getId() == 2) {
- students.remove(stu);
- break;
- }
- }
- }
- /**
- * 这种遍历有可能会遗漏某个元素,因为删除元素后List的size在
- * 变化,元素的索引也在变化,比如你循环到第2个元素的时候你把它删了,
- * 接下来你去访问第3个元素,实际上访问到的是原先的第4个元素。当访问的元素
- * 索引超过了当前的List的size后还会出现数组越界的异常,当然这里不会出现这种异常,
- * 因为这里每遍历一次都重新拿了一次当前List的size。
- */
- 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);
- }
- }
- }
- /**
- * 使用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);
- }
附完整代码如下:
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- public class ListRemove {
- public static void main(String args[]) {
- ListRemove lr = new ListRemove();
- lr.listRemove();
- lr.listRemoveBreak();
- // lr.listRemove2();
- // lr.iteratorRemove();
- }
- /**
- * 使用增强的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进行遍历删除,但删除之后马上就跳出的也不会出现异常
- */
- public void listRemoveBreak() {
- List<Student> students = this.getStudents();
- for (Student stu : students) {
- if (stu.getId() == 2) {
- students.remove(stu);
- break;
- }
- }
- }
- /**
- * 这种不使用增强的for循环,每次重新获取list的size遍历的情况运行时不会报错,但是可能删除的结果是错的。
- */
- public void listRemove2() {
- List<Student> students = this.getStudents();
- for (int i=0; i<students.size(); i++) {
- if (students.get(i).getId()%2 == 0)
- students.remove(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();
- }
- System.out.println(students);
- }
- private List<Student> getStudents() {
- List<Student> students = new ArrayList<Student>() {
- {
- int i = 0;
- while (i++ < 10) {
- Student student = new Student(i, "201200" + i, "name_" + i);
- this.add(student);
- }
- }
- };
- return students;
- }
- }
- public class Student {
- private int id;
- private String stuNo;
- private String name;
- public Student() {
- }
- public Student(int id, String stuNo, String name) {
- this.id = id;
- this.stuNo = stuNo;
- this.name = name;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getStuNo() {
- return stuNo;
- }
- public void setStuNo(String stuNo) {
- this.stuNo = stuNo;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public String toString() {
- return "Student [id=" + id + ", name=" + name + ", stuNo=" + stuNo
- + "]";
- }
- }
import java.util.ArrayList;
import java.util.Iterator;
/**
* Created by Administrator on 2015/11/23 0023.
*/
public class DeleteArray {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<String>();
for(int i=0;i<10;i++)
list.add(i+"");
System.out.println(list);
listRemove5(list);
System.out.println(list);
}
/**
* 这是最正确的做法,用迭代器iterator来遍历删除,因为iterator是list的一个引用,因此它的操作会对list产生影响。
* @param list
*/
private static void listRemove5(ArrayList<String> list) {
Iterator<String> it=list.iterator();
int i=0;
while(it.hasNext()){
String str=it.next();
if(i%2==0) {
it.remove();
// list.remove(it);
}
i++;
}
}
/**
* 简单的for循环删除,因为ArrayList在内存中的存储是顺序的,因此删除后后面的元素会自动向前移动,
* 这样得到的结果就是错误的
* @param list
*/
private static void listRemove3(ArrayList<String> list) {
for(int i=0;i<list.size();i++){
if(i%2==0)
list.remove(i);
}
}
private static void listRemove4(ArrayList<String> list) {
for(int i=0;i<list.size();i++){
String str=list.get(i);
if(i%2==0)
list.remove(str);
}
}
/**
* 这样可以删除一个是不报错的
*/
private static void listRemove2(ArrayList<String> list) {
int i=0;
for(String s:list){
if(i%2==0)
list.remove(s);
break;
}
}
/**
* 这样循环删除是会报异常的
* @param list
*/
private static void listRemove1(ArrayList<String> list) {
int i=0;
for(String s:list){
if(i%2==0)
list.remove(s);
i++;
}
}
}
但是后来我有测试了一个实例就是这个条件不是跟下标有关系的而是一个设定的条件:如:删除一个整型list中的偶数:
package deleteArrary;
import java.util.ArrayList;
/**
* Created by Administrator on 2015/11/23 0023.
*/
public class Test {
public static void main(String[] args) {
ArrayList<Integer> list=new ArrayList<Integer>();
for(int i=0;i<10;i++)
list.add(i);
for(int i=0;i<5;i++)
list.add(i);
System.out.println(list);
listRemove(list);
System.out.println(list);
}
private static void listRemove(ArrayList<Integer> list) {
for(int i=0;i<list.size();i++){
Integer j=list.get(i);
if(j%2==0)
list.remove(j);
}
}
}
这样也是正确的,只要不跟下标产生什么关系就ok。但是前提是for(int i=0;i<list.size();i++)这个循环而不是for each(Object o:list),因为删除一个是对的,但是删除多个那么就会报异常Exception in thread "main" java.util.ConcurrentModificationException