String数组转化List数组之java.lang.UnsupportedOperationException异常问题

首先先简单的看一个例子

 public static void main(String[] args) {
        String []  s = {"4","3"};
		List<String> list = Arrays.asList(s);
		list.add("2");
		System.out.println(list.size());
 }

这段代码看起来好像没啥子问题撒,编译正常,但是运行之后就会发现不是你想要的样子,为什么呢,来,瞜一眼报错看看

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(Unknown Source)
	at java.util.AbstractList.add(Unknown Source)
	at com.cn.xhwang.safety.utils.RegexType.main(RegexType.java:61)

这家伙报错报的一脸懵逼,不晓得要干啥,正逢冬天都想直接出去打一场走医疗保险的雪仗,注意,这儿不是说调用list的add方法会报错,而是操作list都会报错,包括那些remove...

来,我们先提供解决方案,将String数组转化为list数组之后,如果要操作数组,还需转化为java.util.ArrayList对象,这个样子就可以了

List<String> list = new ArrayList<String>(Arrays.asList(s));

接下来,我们再看看为什么报这样的错,为什么要这样解决,来,我们先看看源码里面是怎么解释的,

查看Arrays源码,我们发现这个一个信息,调用aslist方法,返回了一个 new ArrayList,换句话说(返回的是Arrays的内部类ArrayList,而不是java.util.Arraylist)而这个内部类ArrayList继承自abstractList,那我们先来看看abstractList里面对于操作数组是提供了一个什么接口

纳尼,父类提供了一个方法,方法里面默认new了一个异常,咋 的一看,这个异常好熟悉,这不就是我们报错的异常吗,对喽,这个异常就是一开始测试方法里面包的异常,那么,问题来了,为什么会报这个异常呢,来,我们返回来接着看Arrays源码,里面的ArrayList既然继承了abstractList,那么我们来看看它对父类里面的这些方法进行了什么操作,找了一圈,我们惊奇的发现而Arrays的内部类ArrayList根本没有重写这些方法,所以在我们调用Arrays.asList(s).add的时候,他默认使用了父类的方法,这样,异常就自然而然的报出来了....咳,呸,真懒

接下来,就到高潮部分了,既然知道了为什么报错,那我们怎么去解决它呢,我们就想到了java.util.Arraylist,有些人这儿就迷茫了,上面那个不也是Arraylist吗?对,你说的没错,字面意思确实是一样,但是Arrays源码里面那个Arraylist是一个内部类,现在我们说的是java.util.Arraylist,他两可是有本质上的区别,来我们看看java.util.Arraylist的源码

刚开头,我们就发现了这一段代码,显然,它也是继承了abstractList,那么我们看下它里面对于那些操作数组的方法有咩有进行重写,接着我们就找到了这么一段代码

重写了!!!,它把它爹的宏图大志完成了,所以说,还是亲生的好,这就明白了一开始我们为什么要那样解决了,其实,总结起来就是原因是因为Arrays.aslist(s)返回的是Arrays的内部类ArrayList,而不是java.util.Arraylist,Arrays的内部类ArraysList和java.util.ArraysList都继承
 abstractList,而在abstractList中这些add,remove,方法都默认是throw UnsupportedOperationException而不做任何操作,在java.util.ArrayList中
 重写了这些方法,而Arrays的内部类ArrayList没有重写这些方法,所以会报错,  所以在此处将String数组转化为list数组之后,如果要操作数组,还需转化为java.util.ArrayList对象

以上均为个人观点,如果错误之处,还望不吝指出

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值