栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【问题小记】Arrays.asList()方法问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【问题小记】Arrays.asList()方法问题

Arrays.asList()方法问题小记 项目场景:

java环境下,将多个String.split(String regex)方法返回的String[],合并到一个List集合里


问题描述:

Arrays.asList明明返回的就是ArrayList对象,但是操作arrayList.addAll(Collection 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 sp1 = Arrays.asList(split1);
    List 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 sp1 = Arrays.asList(split1);
	List 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]

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/781414.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号