zoukankan      html  css  js  c++  java
  • Arrays.asList()生成的List抛UnsupportedOperationException分析

    一.背景:使用工具类 Arrays.asList()把数组转换成集合时,使用其修改集合相关的方

    法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。

    二.分析:既然是List为何不能进行增删改的操作?

    1.Arrays.asList(str)调用的是Arrays类中的asList方法,该方法返回一个ArrayList对象。

    2.进入asList方法发现这个ArrayList是Arrays的一个继承AbstractList的静态内部类,根本不是java.util下的ArrayList.也并没有提供add,remove,clear方法。

    3.其实Arrays$ArraysList调用add调用的是父类AbstractList中的方法add(E e)

     

    4.父类AbstractList最终调用add(int index,E element),即抛出异常。

    5.再看下java.util下的ArrayList,ArrayList跟Arrays$ArrayList同样都继承AbstractList

    6.再看下java.util下的ArrayList为啥不会报错呢?因为java.util.ArrayList覆盖了父类中的add方法。所以不会报错

    三:总结

    public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> AbstractList是一个List抽象类,继承AbstractCollection,实现List接口,Arrays$ArrayList和java.util.ArrayList都继承AbstractList。

    Arrays.asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法,add/remove/clear调用的是父类中的方法,而父类中不支持这种操作,除非子类进行覆盖(java.util.ArrayList就进行了覆盖所以不会报错)Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。 

  • 相关阅读:
    vim 去掉自动注释和自动回车
    性别回归
    表情识别
    python list按字典的key值排序
    pytorch学习率策略
    python将list元素转为数字
    php面向对象
    mysql
    mysql
    mysql
  • 原文地址:https://www.cnblogs.com/hupu-jr/p/8080456.html
Copyright © 2011-2022 走看看