Chinaunix首页 | 论坛 | 博客
  • 博客访问: 519196
  • 博文数量: 135
  • 博客积分: 3568
  • 博客等级: 中校
  • 技术积分: 1942
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-19 17:52
文章分类

全部博文(135)

文章存档

2012年(29)

2011年(41)

2010年(26)

2009年(12)

2008年(9)

2007年(12)

2006年(6)

分类: Java

2010-12-03 09:53:39

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class T {
    public static void main(String[] args) {
        try {
            main_1(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            main_2(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            main_3(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /** 使用LinkedList */
    public static void main_1(String[] args) {
        List<Integer> list = new LinkedList<Integer>();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        System.out.println(list);
        for (int i : list) {
            if (i % 2 == 0) {
                list.remove(i / 2);
            }
        }
        System.out.println(list);
    }
    
    /** 使用ArrayList */
    public static void main_2(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        System.out.println(list);
        for (int i : list) {
            if (i % 2 == 0) {
                list.remove(i / 2);
            }
        }
        System.out.println(list);
    }
    
    /** 使用Arrays.asList() */
    public static void main_3(String[] args) {
        List<Integer> list = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
        System.out.println(list);
        for (int i : list) {
            if (i % 2 == 0) {
                list.remove(i / 2);
            }
        }
        System.out.println(list);
    }
}

 

结果:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
java.util.ConcurrentModificationException
    at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:761)
    at java.util.LinkedList$ListItr.next(LinkedList.java:696)
    at T.main_1(T.java:32)
    at T.main(T.java:9)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
    at java.util.AbstractList$Itr.next(AbstractList.java:343)
    at T.main_2(T.java:47)
    at T.main(T.java:14)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
java.lang.UnsupportedOperationException
    at java.util.AbstractList.remove(AbstractList.java:144)
    at T.main_3(T.java:61)
    at T.main(T.java:19)


正确的方法应该是:
但是注意,通过迭代器也只能删除正在迭代的值,而不能删除已经迭代过了的或者尚未迭代到得值。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class T {

    /**
     * 正常 - 可以通过迭代器删除LinkedList。
     *
     * @param args
     */

    public static void main2(String[] args) {
        List<Integer> list = new LinkedList<Integer>();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        System.out.println(list);
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()) {
            int i = it.next();
            if (i % 2 == 0) {
                it.remove();
            }
        }
        System.out.println(list);
    }

    /**
     * 正常 - 可以通过迭代器删除ArrayList。
     *
     * @param args
     */

    public static void main1(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        System.out.println(list);
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()) {
            int i = it.next();
            if (i % 2 == 0) {
                it.remove();
            }
        }
        System.out.println(list);
    }
    
    /**
     * 异常 - UnsupportedOperationException,不可以通过迭代器删除Arrays.asList(...)。
     *
     * @param args
     */

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);

        System.out.println(list);
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()) {
            int i = it.next();
            if (i % 2 == 0) {
                it.remove();
            }
        }
        System.out.println(list);
    }
}


阅读(1076) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~