美文网首页
Array数组与List集合之间相互转化的细节

Array数组与List集合之间相互转化的细节

作者: 黎景阳 | 来源:发表于2017-02-16 11:52 被阅读818次

    集合转数组  :  大家想马上想到的应该是toArray方法  ,但List 复写了多个toArry方法,,不知道看官平时用的是那个

    个人推荐 使用  使用 toArray(T[] array) 传入的参数是类型完全一样的数组,大小就是list.size().  

            分析:使用toArray带参方法,入参分配的数组空间不够大时,toArray方法内部将重新分配内存空间,并返回新数组地址 ; 如果元素大于实际所需,

              下标为[list.size()]的数组元素将被置为null,其他元素保持原值,因此最好将方法入参数组大小定义与集合元素一致.

        List list = new ArrayList(2);

        list.add("hello");

        list.add("world");

        String[] array = new String[list.size()];

         array = list.toArray(array);

    不推荐使用 toArray() 无参方法,,,直接使用toArray无参方法存在问题,此方法返回值只能是Object[]类,若强转其它

    类型数组将出现ClassCastException错误。


    数组转集合   常用方法 Arrays.asList(), 但你是否知道调用此方法返回的List类型不能执行相关修改的方法比如add/remove/clear  执行的时候会报错 UnsupportOperationException 不支持的操作异常,这又是why?

    分析如下:



    效果截图

    结果  调用get方法是正常的,,在执行remove 方法的时候报错的 ,,

    分析 :

       进入Arrays.asList()方法观看源码

    Arrays.asList()源码

    此时 asList 方法中直接  new ArrayList ()返回   ,再看下方代码发现了一个内部类ArrayList  

    在内部类的构造函数 ArrayList()中  返回的是一个数组.

    所以 asList 返回的ArrayList 和java.util包中的ArrayList 不是同一个类 ,,

    Arrays中的内部类ArrayList 继承了AbstractList ,,而AbstractList 是接口List 实现

    所有 在返回后的List 集合是AbstractList 的子类ArrayList(Arrays的一个内部类)的实例, 那调用的remove 方法也是在这个类中的实现

    但其实这个内部类ArrayList本身只重写get方法,而没有重写remove这个方法,,是继承与分类AbstractList 中的remove方法

    查看 AbstractList 


    AbstractList 源码

      瞬间 豁然开朗了 ...


    总结一下 ,,asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.asList

    中体现的是适配器模式,只是转换接口,后台的数据仍是数组

    相关文章

      网友评论

          本文标题:Array数组与List集合之间相互转化的细节

          本文链接:https://www.haomeiwen.com/subject/zhncwttx.html