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

2017-02-16  本文已影响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

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

上一篇 下一篇

猜你喜欢

热点阅读