<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聶永的博客

    記錄工作/學習的點點滴滴。

    循環刪除List數組容器里面元素

    嗯,大部分都會遇到這個問題,定義一個List<T>數組,然后需要循環一下,刪除其中一個元素,但會遇到類似問題:
    java.util.ConcurrentModificationException
    怎么辦,實用主義者會把List數組轉換成Iterator進行迭代刪除,一點問題都沒有:
     public static void main(String[] args) {
    List<Student> students = pareStudents();

    System.out.println("size : " + students.size());
    System.out.println(students);

    System.out.println("delete Student with name xiaoi");

    Iterator<Student>stuIter = students.iterator();

    while(stuIter.hasNext()){
    Student stu = stuIter.next();
    if(stu.getName().equals("xiaoi")){
    stuIter.remove();
    }
    }

    System.out.println("size : " + students.size());
    System.out.println(students);
    }

    Iterator進行循環操作,然后刪除,是很安全的。可以解決一些問題。但不要再使用Iterator的時候使用students.remove(stu),一樣會給出 java.util.ConcurrentModificationException 錯誤。


    另一個方法就是重新構建一個List,把原先的students 數組作為參數傳遞進去即可,雖然生成了一個全新的數組,但都是Student對象的引用,多個引用的地址數組而已。


     public static void main(String[] args) {
    List<Student> students = pareStudents();

    System.out.println("size : " + students.size());
    System.out.println(students);

    System.out.println("delete Student with name xiaoi");
    for(Student s : new ArrayList<Student>(students)){
    if(s.getName().equals("xiaoi")){
    students.remove(s);
    }
    }

    System.out.println("size : " + students.size());
    System.out.println(students);
    }


    需要那一種方式,那就自便了,個人傾向于使用Iterator。
    完整測試代碼如下:

    public class DeleteList {
    private static class Student{
    private String name;
    private int age;

    public Student(String name, int age) {
    this.name = name;
    this.age = age;
    }

    public int getAge() {
    return age;
    }

    public void setAge(int age) {
    this.age = age;
    }

    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }

    public int hashCode() {
    return name.hashCode();
    }

    public boolean equals(Object obj) {
    if(obj == null || !(obj instanceof Student)){
    return false;
    }

    Student objStu = (Student)obj;
    return objStu.getName().equals(this.getName()) && objStu.getAge() == this.getAge();
    }

    public String toString(){
    return name + " : " + age;
    }
    }

    private static List<Student> pareStudents(){
    ArrayList<Student> students = new ArrayList<Student>();

    students.add(new Student("xiaoi", 18));
    students.add(new Student("xiaoxin", 19));
    students.add(new Student("john", 20));
    students.add(new Student("xiaomei", 23));

    return students;
    }

    public static void main(String[] args) {
    List<Student> students = pareStudents();

    System.out.println("size : " + students.size());
    System.out.println(students);

    System.out.println("delete Student with name xiaoi");
    for(Student s : new ArrayList<Student>(students)){
    if(s.getName().equals("xiaoi")){
    students.remove(s);
    }
    }

    System.out.println("size : " + students.size());
    System.out.println(students);
    }

    public static void main2(String[] args) {
    List<Student> students = pareStudents();

    System.out.println("size : " + students.size());
    System.out.println(students);

    System.out.println("delete Student with name xiaoi");

    Iterator<Student>stuIter = students.iterator();

    while(stuIter.hasNext()){
    Student stu = stuIter.next();
    if(stu.getName().equals("xiaoi")){
    stuIter.remove();
    }
    }

    System.out.println("size : " + students.size());
    System.out.println(students);
    }
    }

    Iterator 是工作在一個獨立的線程中,并且擁有一個 mutex 鎖。 Iterator 被創建之后會建立一個指向原來對象的單鏈索引表,當原來的對象數量發生變化時,這個索引表的內容不會同步改變,所以當索引指針往后移動的時候就找不到要迭 代的對象,所以按照 fail-fast 原則 Iterator 會馬上拋出 java.util.ConcurrentModificationException 異常。

    所以 Iterator 在工作的時候是不允許被迭代的對象被改變的。但你可以使用 Iterator 本身的方法 remove() 來刪除對象, Iterator.remove() 方法會在刪除當前迭代對象的同時維護索引的一致性。

    refer url : http://www.cnblogs.com/iloveu/archive/2009/06/23/1509385.html

    posted on 2010-10-09 10:36 nieyong 閱讀(4523) 評論(0)  編輯  收藏 所屬分類: Java

    公告

    所有文章皆為原創,若轉載請標明出處,謝謝~

    新浪微博,歡迎關注:

    導航

    <2010年10月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    統計

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 羞羞的视频在线免费观看| 日本亚洲中午字幕乱码 | 亚洲国产无套无码av电影| 国产亚洲美女精品久久| 四虎影视永久免费观看网址| 亚洲精品无码你懂的| 天天摸天天碰成人免费视频| 亚洲国产精品ⅴa在线观看| 免费看大黄高清网站视频在线| 亚洲精华国产精华精华液| 免费黄色大片网站| 亚洲国产精品美女久久久久| 日本大片在线看黄a∨免费| 无码天堂va亚洲va在线va| 亚洲成a人片在线播放| 一级毛片免费全部播放| 亚洲欧洲成人精品香蕉网| 99爱免费观看视频在线| 亚洲伊人精品综合在合线| 德国女人一级毛片免费| selaoban在线视频免费精品| 亚洲AV无码久久| 久久久高清免费视频| 婷婷国产偷v国产偷v亚洲| 亚洲色无码专区在线观看| 国产免费不卡视频| 99亚洲精品卡2卡三卡4卡2卡| 自拍偷自拍亚洲精品第1页| 2019中文字幕免费电影在线播放 | 中文字幕天天躁日日躁狠狠躁免费| 亚洲天堂福利视频| 免费国内精品久久久久影院| 伊人免费在线观看高清版| 亚洲人成影院在线高清| 亚洲国产精品成人AV无码久久综合影院| 香蕉视频在线免费看| 亚洲伊人久久大香线蕉影院| 亚洲精品国产电影| 91精品全国免费观看含羞草| 亚洲日韩在线中文字幕综合| 精品亚洲永久免费精品|