zoukankan      html  css  js  c++  java
  • Java之Arrays.asList陷阱

    Java.Util.Arrays可以将数组转换为List,具体的定义如下:

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

    可以看到实际上是将这个数组转换成为了ArrayList<>,看似没有问题,但是当我们使用add和remove的时候,会发现会抛出UnsupportedOperationException,为什么?这个不科学呀!
    进入Arrays的源代码才发现...尼玛这坑人...

    1. Arrays.asList方法中返回的是List<>,但是实际上它继承的是AbstractList<>
    2. AbstractList<>继承自AbstractCollection<>和List<>
    3. Arrays.asList之后出来的List<>是无法操作add和remove的,会抛出UnsupportedOperationException异常

    Arrays.asList中返回的ArrayList<>定义:

    private static class ArrayList<E> extends AbstractList<E>
            implements RandomAccess, java.io.Serializable
    {
        ...
    }

    AbstractList的定义:

    public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
        ...
    }

    那下面在来看一下ArrayList<E>中add和remove方法的实现吧,搜索了一下,没有找到add和remove方法!
    好吧,那我去AbstractList里找,搜了一下,找到了add方法的定义:

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

    好吧,那继续F3查找add(int index, E element)的定义:

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

    看到了什么?坑爹吧就!
    再看看remove方法:

    public E remove(int index) {
        throw new UnsupportedOperationException();
    }

    好吧,一排排的黑线啊...
    终于找到原因了,那怎么处理呢?


    解决方案:

    需要用ArrayList处理一下:

    Long[] idLongArrs = {1L, 2L, 3L};
    ArrayList<Long> ids = new ArrayList<Long>(Arrays.asList(idLongArrs));
  • 相关阅读:
    node--ubuntu 安装
    vue+node 全栈开发 --- 同时运行vue和node
    vue-$nextTick() 没有获取到DOM
    Window Terminal
    解析NaN
    HTML页面预览表格文件内容
    python爬虫-爬坑之路
    VSCode-VUE模板文件
    markdown-sample.md
    待继续博文
  • 原文地址:https://www.cnblogs.com/treerain/p/Java_Arrays_asList.html
Copyright © 2011-2022 走看看