从List中删除符合条件的元素需要用到Iterator.remove()方法,但今天我发现如果List是通过Arrays.asList(数组)生成的话,则使用Iterator.remove()删除此List中的元素是会报告UnsupportedOperationException异常,这是何故?请高手赐教! 示例代码:
String[] strs = new String[]{"a","b","c","d","e"};List<String> strList = Arrays.asList(strs);
Iterator<String> it = strList.iterator();
while(it.hasNext()) {
if(it.next().equals("c")) {
it.remove();//报错
}
}
System.out.println(strs);

解决方案 »

  1.   


    这个就是语义的问题了. 对于String[]类型来说, 你不可以删除里面的元素, 而导致后续的元素移动.
    这个是Java语言的问题, 就是应该抛出这个异常的.
      

  2.   

    等不及回复,刚才查了一下api,看见这么一句话:(asList)返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直写”到数组。)看来问题就出在这里,asList返回的不是“传统”意义上的List,而是对数组包装了一下,本质还是数组,所以不能够remove。注意上面那句帮助原文:对返回列表的更改会“直写”到数组。
      

  3.   

    是啊, 
    在java里, String s = "Hello";
    s[0] = 'h';你不可能写出这样的代码, 因为s聚合的是final的char[].
    道理是一样的.在C++善用const和模板就不会出现这样的尴尬, 因为const Type和Type是不同的类型, 很容易就可以造成编译错误, 而不是运行错误.
      

  4.   

    UnsupportedOperationException
    不支持这个方法而已拉`
      

  5.   

    那么对于getMethods()返回的Method[],我想根据条件删除里面的method,就非得再定义一个数组或者List不可?
      

  6.   

    还有一个我想知道的问题就是为什么把数组用asList加一个List外壳就有了iterator?这样的List里面是一个什么样的结构?
      

  7.   

    List本事是个 LinkedList, 而数组肯定是个随即存储的容器. 你可以理解为这样: List<E>是Array的一个Adapter类.template<class E>
    class List
    {
        ListNode* head;    List(const E* elements) {
            //construct a linked list, and each element points to a array element
            for(;;) {
            ListNode* node = new ListNode;
            node->data = elements[index];
            node->next = ...
            }
              
        }
    }伪码大致如此.
      

  8.   

    多谢healer_kx,要是你能用纯java代码说事就好了。第一次发帖,不晓得怎样加分啊。周一回来再看看有没有什么好答案。
      

  9.   

    Java代码和C++很像啊,我写的也不是真正的C++,只是伪码,你能感受到那个意思就可以了.纯Java代码好说啊...
    public static <T> List<T> asList(T... a) {
    return new ArrayList<T>(a);
        }////////////////////
    private Object[] a;
    ////////////////////
    ArrayList(E[] array) {
                if (array==null)
                    throw new NullPointerException();
        a = array;
    }这些代码是我从Java源码里面copy出来的,     private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable
    这个类就是我说的Adapter了
      

  10.   


    List<String> list = new ArrayList<String>(Arrays.asList(arr));
         for(Iterator<String> iter = list.iterator();iter.hasNext();) {
         String s = iter.next();
         if(StringUtils.isEmpty(s)) {
         iter.remove();
         }
         }
    这样就可以了。