Arrays.asList()方法问题小记
项目场景:
java环境下,将多个String.split(String regex)方法返回的String[],合并到一个List集合里
问题描述:
Arrays.asList明明返回的就是ArrayList对象,但是操作arrayList.addAll(Collection<? extends E> c)时候,报错了…
错误重现代码如下:
public static void main(String[] args) {
String loss = "05:1,06:1,07:1,08:1,10:1";
String mStr = "A:1,B:0,C:0,D:0";
String[] split1 = loss.split(",");
String[] split2 = mStr.split(",");
List<String> sp1 = Arrays.asList(split1);
List<String> sp2 = Arrays.asList(split2);
sp1.addAll(sp2);// 这里报错...
System.out.println(sp1.toString());
}
错误信息如下:不支持的操作
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at java.util.AbstractCollection.addAll(AbstractCollection.java:344)
at ...
原因分析:
List.addAll()是常用的方法,之前没注意到还会报这种错误的。扒拉代码AbstractCollection.java:344,指向的处理方法都是直接抛出这个异常?
AbstractList.java:148
而且看到这个Arrays.asList() --> new ArrayList(T t),返回的ArrayList是Arrays的内部类ArrayList,竟然不是java.util包下的ArrayList。
以上可知:
- Arrays.asList()是将数组引用直接指向Arrays.ArrayList内部类的一个数组属性,且初始化时已经定长,如果可以操作就会改变原有被添加数组的数据,存在数据的不确定性。也是为了方法的功能单一性。
- 所以 Arrays.ArrayList内部类没有重写父类AbstractList下的add/addAll/remove这些操作方法。而父类AbstractList里面的所有增删操作都指向了throw new UnsupportedOperationException()处理。
解决方案:
针对以上问题:摒弃list.addAll()方法,可以在List sp1 = Arrays.asList(split1)后,经java.util.ArrayList类转换:
List<String> sp1 = Arrays.asList(split1);
List<String> sp2 = Arrays.asList(split2);
ArrayList arrayList1 = new ArrayList(sp1);
arrayList1.addAll(sp2);
System.out.println(arrayList1.toString());
输出结果:[05:1, 06:1, 07:1, 08:1, 10:1, A:1, B:0, C:0, D:0]