GVKun编程网logo

Java List.add()UnsupportedOperationException

24

在这篇文章中,我们将带领您了解JavaList.add的全貌,包括UnsupportedOperationException的相关情况。同时,我们还将为您介绍有关add、delete操作报Unsupp

在这篇文章中,我们将带领您了解Java List.add的全貌,包括UnsupportedOperationException的相关情况。同时,我们还将为您介绍有关add、delete操作报UnsupportedOperationException的错、Arrays.asList 数组转集合 java.lang.UnsupportedOperationException错误、Arrays.asList()报错java.lang.UnsupportedOperationException、Arrays.asList给出UnsupportedOperationException的知识,以帮助您更好地理解这个主题。

本文目录一览:

Java List.add()UnsupportedOperationException

Java List.add()UnsupportedOperationException

我尝试将对象添加到List<String>实例,但会引发UnsupportedOperationException。有人知道为什么吗?

我的Java代码:

String[] membersArray = request.getParameterValues(''members'');List<String> membersList = Arrays.asList(membersArray);for (String member : membersList) {    Person person = Dao.findByName(member);    List<String> seeAlso;    seeAlso = person.getSeeAlso();    if (!seeAlso.contains(groupDn)){        seeAlso.add(groupDn);        person.setSeeAlso(seeAlso);    }}

错误信息:

java.lang.UnsupportedOperationException    java.util.AbstractList.add(未知源)    java.util.AbstractList.add(未知源)    javax.servlet.http.HttpServlet.service(HttpServlet.java:641)    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

答案1

小编典典

并非每个List实现都支持该add()方法。

一个常见的示例是通过以下方式List返回的Arrays.asList():它被记录为不支持任何结构修改(即,删除或添加元素)(强调我的意思):

返回由指定数组支持的固定大小的列表。

即使这不是List你要修改的特定内容,答案仍然适用于List不可变或仅允许某些选定更改的其他实现。

你可以通过阅读的文档,了解这个UnsupportedOperationExceptionList.add(),其中记录了这是一个“(可选操作)”。该短语的确切含义在List文档顶部进行了说明。

解决方法是,你可以将列表的副本创建到已知的可修改实现中,例如ArrayList

seeAlso = new ArrayList<>(seeAlso);

add、delete操作报UnsupportedOperationException的错

add、delete操作报UnsupportedOperationException的错

add、delete操作报UnsupportedOperationException的错

addAll操作报UnsupportedOperationException错误

上面的代码,粗粗一看发现,没有什么bug

String temp="1,2,3;
List<String>list1 = Arrays.asList(temp.split(",")); 
list1.add("4");
  • 1
  • 2
  • 3

可是报如下错误。就算报了错,也觉得没有错,难道list不能add吗?

后面才发现,其实不是不能add,只要改变 list大小的操作,都会报下面的错。
java.lang.UnsupportedOperationException

点进去看asList的源码,发现asList方法中返回了一个ArrayList的对象。asList的方法在java.util.Arrays这个包中,在这个aslist的方法的后面几行就是一个叫ArrayList的内部类。

天啊,好坑啊。

@SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

    /**
     * @serial include
     */
    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }

        @Override
        public int size() {
            return a.length;
        }
      ....
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

首先看出,asList 方法返回的ArrayList只是java.util.Arrays中的内部类,我们常用的new ArrayListjava.util.Arraylist .内部类中的ArrayList继承了AbstractList,但是并没有重写addremove等方法,所以调用这些方法的时候调用的都是父类AbstractList中的方法。

java.util.Arrays中的内部类
    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    

我们先看AbstractList包下的ArrayListadd方法

    public boolean add(E e) {
        add(size(), e);
        return true;
    }

    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

他在这里直接就给抛异常了。C语言。

平常使用的java.util包下的ArrayListadd方法

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
  • 1
  • 2
  • 3
  • 4
  • 5

###所以,Arrays.asList()返回的list仅支持那些不会改变集合大小的操作。

如果要用的话,也可以如下使用:

 List<String>list = new ArrayList<>(Arrays.asList(new String[]{"a", "b"}));
        list.add("c");
        System.out.println(list);
  • 1
  • 2
  • 3

Arrays.asList0的结果作为构造器的参数传递给任何`Collection。这样就可以正常操作了

Arrays.asList 数组转集合 java.lang.UnsupportedOperationException错误

Arrays.asList 数组转集合 java.lang.UnsupportedOperationException错误

 

public static void main(String[] args) {
    String[] keyArrayStr = new String[]{"123","ewe","323","093"};
    Map<String,String> removeMap = new HashMap<String,String>();
    removeMap.put("123", "1");
    removeMap.put("ewe", "1");
    removeMap.put("323", "1");
    removeMap.put("093", "1");

// 注意这里:单纯的使用 Arrays.asList 把数组转换为集合后,使用 .add() .remove() 会报 java.lang.UnsupportedOperationException 错误
// 原因:Arrays.asList 转换的ArrayList 是内部类,并不是 java.util.ArrayList,内部类下没有 add、remove 方法导致的。
// 解决方案: new ArrayList(Arrays.asList()); 
List<String> tempList = new ArrayList(Arrays.asList(keyArrayStr));
for (int i = 0; i < tempList.size(); i++) {
    if (removeMap.containsKey(tempList.get(i))) {
        tempList.remove(i);
        i--;
    }
}
keyArrayStr = tempList.toArray(new String[tempList.size()]);

}

 

Arrays.asList()报错java.lang.UnsupportedOperationException

Arrays.asList()报错java.lang.UnsupportedOperationException

问题:

使用工具类Arrays.asList()方法把数组转换成集合时,不能使用修改集合相关的方法,比如add,remove。这个ArrayList是Arrays类自己定义的一个内部类!这个内部类没有实现add()、remove()方法,而是直接使用它的父类

的相应方法。而父类中的add()和remove()是直接抛出异常的

源码:

解决方法:

总结:

1.Arrays.asList()底层其实还是数组;

2.如果使用了Arrays.asList()的话,最好不要使用其集合的操作方法;

3. List list = new ArrayList<>(Arrays.asList(“a”, “b”, “c”))可以在外面这样包一层真正的ArrayList

Arrays.asList给出UnsupportedOperationException

Arrays.asList给出UnsupportedOperationException

List通过返回Arrays.asList不能通过使用方法如被修改addremove。但是,如果将其传递给该Collections.sort方法,它将可以对数组进行排序而不会出现任何问题(我希望有一个例外)。这似乎是非常不一致的行为。那么ListasList方法返回的对允许的操作是什么?

List<Integer> list = Arrays.asList(5,7,10,8,9);
list.remove(2);//Exception

Collections.sort(list);//Ok,No Exception Sort...
System.out.println(list);

我在文档中找不到任何线索。

编辑: 是的,我可以理解为什么它不支持removeadd。但是,它如何支持排序呢?

关于Java List.addUnsupportedOperationException的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于add、delete操作报UnsupportedOperationException的错、Arrays.asList 数组转集合 java.lang.UnsupportedOperationException错误、Arrays.asList()报错java.lang.UnsupportedOperationException、Arrays.asList给出UnsupportedOperationException的相关知识,请在本站寻找。

本文标签:

上一篇如何在Java中将int []转换为Integer []?(java怎么将int转换为char)

下一篇如何在Java中使用toString方法将int数组转换为String(java int数组转换成string数组)