Arrays.asList创建的ArrayList并非java.util.ArrayList

项目中有遇到过对Arrays.asList生成的ArrayList进行add操作时报出UnsupportedOperationException异常。这是因为此ArrayList并非彼ArrayList。
在这里插入图片描述
这里生成的ArrayList是Arrays的私有静态内部类。
在这里插入图片描述
与java.util.ArrayList非常类似,都继承自AbstractList。但是仅重写了toArray、get、set、indexOf、contains、forEach等方法,并没有重写add,其父类中的add
在这里插入图片描述
这就是为什么对其进行add会抛异常的原因。
再说一个小细节,这个asList方法上有一个@SafeVarargs的注解,该注解是JDK1.7引入的,主要目的是处理可变长参数中的泛型,告诉编译器,在可变长参数中的泛型是类型安全的。可变长参数是使用数组存储的,而数组和泛型不能很好的混合使用。
还有一种类似的快速创建List的方法Collections.singletonList也是一样的,得到的是一个Collections中的静态内部类SingletonList。
例如HttpMessageConverter中用来缓存supportedMediaTypes的List就是这样的List,只能查询遍历排序,不允许add。
在这里插入图片描述
因此有扩充MediaType需求的时候需要重新定义一个ArrayList,将原来的addAll进去。
在这里插入图片描述

发布了26 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_36142042/article/details/104861911
今日推荐