我正在实现一个程序,以从2个字符的数组中删除重复项。我实现了这两个解决方案,解决方案1正常工作,但是解决方案2给了我UnSupportedOperationException。为什么会这样?错误在第al1.removeAll(al2);

public void getDiffernce(Character[] inp1, Character[] inp2){

    // SOLUTION 1:
    // **********************************************

    List<Character> list1 = new ArrayList<Character>(Arrays.asList(inp1));
    List<Character> list2 = new ArrayList<Character>(Arrays.asList(inp2));
    list1.removeAll(list2);

    System.out.println(list1);
    System.out.println("***************************************");


    // SOLUTION 2:

    Character a[] = {'f', 'x', 'l', 'b', 'y'};
    Character b[] = {'x', 'b','d'};

    List<Character> al1 = new ArrayList<Character>();
    List<Character> al2 = new ArrayList<Character>();
    al1 = (Arrays.asList(a)); System.out.println(al1);
    al2 = (Arrays.asList(b)); System.out.println(al2);
    al1.removeAll(al2);         // error is here
    System.out.println(al1);
}

最佳答案

asList(..)文档:


  返回由指定数组支持的固定大小的列表。 (对返回列表的更改为“直写”到数组。)与Collection.toArray()结合使用,此方法充当基于数组的API和基于集合的API之间的桥梁。返回的列表是可序列化的,并实现RandomAccess。


基本上,asList方法不会创建普通的可变List<E>而是在数组周围创建包装器。因此,remove操作在由数组支持的列表上不可用。

尝试通过手动构建列表来构建它们:

List<Character> al1 = new ArrayList<Character>(Arrays.asList(a))


因此,后备列表仅用于初始化真实的ArrayList

10-05 22:02