集合转数组 : 大家想马上想到的应该是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
瞬间 豁然开朗了 ...
总结一下 ,,asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.asList
中体现的是适配器模式,只是转换接口,后台的数据仍是数组
网友评论