Arrays.asList 使用细节

通常初始化后使用如下,但是报错 UnsupportOperationException....

根据提示信息,就是调用add()方法时抛出了异常。顺着堆栈信息往上找,提示的是AbstractList类的108行出了异常,这一行所在方法的具体实现如下:

//108行
public boolean add(E var1) {this.add(this.size(), var1);return true;}
//148行
public void add(int var1, E var2) {throw new UnsupportedOperationException();}//下面看下Arrays.asList的具体实现
@SafeVarargs
public static <T> List<T> asList(T... var0) {return new Arrays.ArrayList(var0);
}//Arrays.ArrayList 实现
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, Serializable {private static final long serialVersionUID = -2764017481108945198L;private final E[] a;//关键
    ArrayList(E[] var1) {this.a = (Object[])Objects.requireNonNull(var1);}public int size() {return this.a.length;}public Object[] toArray() {return (Object[])this.a.clone();}public <T> T[] toArray(T[] var1) {int var2 = this.size();if (var1.length < var2) {return Arrays.copyOf(this.a, var2, var1.getClass());} else {System.arraycopy(this.a, 0, var1, 0, var2);if (var1.length > var2) {var1[var2] = null;}return var1;}}public E get(int var1) {return this.a[var1];}public E set(int var1, E var2) {Object var3 = this.a[var1];this.a[var1] = var2;return var3;}public int indexOf(Object var1) {Object[] var2 = this.a;int var3;if (var1 == null) {for(var3 = 0; var3 < var2.length; ++var3) {if (var2[var3] == null) {return var3;}}} else {for(var3 = 0; var3 < var2.length; ++var3) {if (var1.equals(var2[var3])) {return var3;}}}return -1;}public boolean contains(Object var1) {return this.indexOf(var1) != -1;}public Spliterator<E> spliterator() {return Spliterators.spliterator(this.a, 16);}public void forEach(Consumer<? super E> var1) {Objects.requireNonNull(var1);Object[] var2 = this.a;int var3 = var2.length;for(int var4 = 0; var4 < var3; ++var4) {Object var5 = var2[var4];var1.accept(var5);}}public void replaceAll(UnaryOperator<E> var1) {Objects.requireNonNull(var1);Object[] var2 = this.a;for(int var3 = 0; var3 < var2.length; ++var3) {var2[var3] = var1.apply(var2[var3]);}}public void sort(Comparator<? super E> var1) {Arrays.sort(this.a, var1);}
}
//此处可以发现,改内部类继承了 AbstractList 但是却没有实现其的add,remove等方法。(下面给出AbstractList 的定义)
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {protected transient int modCount = 0;protected AbstractList() {}public boolean add(E var1) {this.add(this.size(), var1);return true;}public abstract E get(int var1);public E set(int var1, E var2) {throw new UnsupportedOperationException();}public void add(int var1, E var2) {throw new UnsupportedOperationException();}public E remove(int var1) {throw new UnsupportedOperationException();}.......
}

最后,我们发现,此ArrayList不是彼ArrayList。这个ArrayList是Arrays工具类中实现的内部静态类,我们可以发现,这个类集成了AbstractList类,但是并没有重写add()方法,所以在我们的示例代码标记(2)处调用add()方法时,实际是调用父类AbstractList的add()方法,这也就回到了开头分析的那两个add()方法了,它们都没有具体实现,只会抛出UnsupportedOperationException。

结论总结:

  我们调用Arrays的asList()方法将数组转换成List时返回的是Arrays的静态内部类ArrayList,它自身并未重写add()方法,而其父类AbstractList实现的add()方法只会抛出UnsupportedOperationException,导致我们调用Arrays的静态内部类ArrayList的add()方法时,实际调用的是只会抛出UnsupportedOperationException的AbstractList的add()方法,这就是异常出现的原因了。

解决办法

4、 解决方案 
可以自己写个工具类转换方法,可以参考一下代码:

private static <E> List<E> transferArrayList(E[] array){
List<E> transferedList = new ArrayList<>();
Arrays.stream(array).forEach(arr -> transferedList.add(arr));
return transferedList;
}

 

转载于:https://www.cnblogs.com/weixiaotao/p/11345125.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[分享] 精神崩溃的老鼠

李国栋床上堆着书&#xff0c;每天晚上睡在榻榻米上&#xff0c;读书读到凌晨一两点&#xff0c;读到两眼充血&#xff0c;像针扎一样痛苦&#xff0c;才把书放开。蜷缩到榻榻米上&#xff0c;用绳子把左腿跟一只桌脚绑在一起&#xff0c;熄了灯睡觉。 “这样一来&#xff0…

(七)整合spring cloud云服务架构 - common-service 项目构建过程

我们将对common-service整个项目进行剖析&#xff0c;将整个构建的流程给记录下来&#xff0c;让更多的关注者来参考学习。首先在构建spring cloud的common-service之前&#xff0c;我们需要准备的技术&#xff1a;Maven&#xff08;项目构建&#xff09;、Spring Boot、Spring…

python list元素合并_python list 合并连接字符串的方法

python list 合并连接字符串的方法 更新时间&#xff1a;2013年03月09日 22:02:18 作者&#xff1a; python 列表合并字符串&#xff0c;我们一般会用到字符串的join方法来操作。下面通过代码的形式&#xff0c;详细的说下list怎么拼成字符串&#xff1f; 相关文章这篇文章主要…

修改citrix 默认侦听端口的命令和XML Service端口

修改citrix 默认侦听端口的命令&#xff1a; 在命令行下输入icaport /port&#xff1a;2494&#xff0c;或你所想改成的端口 如果输入 icaport /reset 恢复默认侦听端口 ctxxmlss /r8080 在citrix的外部客户端通过web方式登陆时&#xff0c;提示“the alternate address cannot…

spfa算法

1 转载于:https://www.cnblogs.com/Emcikem/p/11346073.html

集成方法-概念理解

集成方法&#xff08;ensemble method&#xff09;又叫元算法&#xff08;meta-algorithm&#xff09;&#xff1a;将不同的分类器组合起来。 通俗的说&#xff1a;就是三个臭皮匠赛过诸葛亮。做决定时&#xff0c;考虑多个人的意见&#xff0c;不是一个人的意见 集成方法&…

单片机按键防抖程序_这些单片机按键设计方案,请拿好,不谢!

在单片机系统里&#xff0c;按键是常见的输入设备&#xff0c;在本文中介绍几种按键硬件、软件设计方面的技巧。一般的在按键的设计上&#xff0c;一般有四种方案&#xff0c;创客学院带你零基础学习电子产品设计。一是GPIO口直接检测单个按键&#xff0c;如图1.1所示;二是按键…

Oracle 11G 安装详解

oracle官网下载地址&#xff1a;http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 官网下载需要注册orcale账号&#xff0c;比较繁琐&#xff0c;这里直接放已经下载好的安装包链接 Oracle11G下载链接: https://pan.baidu.com/s/1v6oD4jAt…

程序员何苦为难程序员?

有时候想想程序员为何为难程序员呢&#xff1f; 扳扳手指走上码农这个行业也有几年了&#xff0c;但是越来越觉得这个行业很累&#xff0c;有人说程序员就是二代农民工&#xff0c;我个人还是比较赞同的&#xff0c;对于刚入道的同仁们来说确实就是个体力(脑力&#xff0c;眼力…

kubeadm部署k8s_用 kubeadm 部署生产级 k8s 集群

概述kubeadm 已⽀持集群部署&#xff0c;且在1.13 版本中 GA&#xff0c;⽀持多 master&#xff0c;多 etcd 集群化部署&#xff0c;它也是官⽅最为推荐的部署⽅式&#xff0c;⼀来是由它的 sig 组来推进的&#xff0c;⼆来 kubeadm 在很多⽅⾯确实很好的利⽤了 kubernetes 的许…

poj 题目分类

1000 AB Problem 送分题 1001 Exponentiation 高精度 1003 Hangover 送分题 1004 Financial Management 送分题 1005 I Think I Need a Houseboat 几何 1006 Biorhythms 送分题 1007 …

模板的语法

我已经碰到过好几次这种错误了. template<typename R>static_inline vec4<typename R::scalar>point(constrhs2<R>&v) { returnvec4<P>(v.x, v.y, 0, 1); } template<typename R>static_inline vec4<typename R::sca…

统计学习方法概论---分类问题

为什么80%的码农都做不了架构师&#xff1f;>>> 分类问题 转载于:https://my.oschina.net/liyangke/blog/2945185

IEPLUS(IE增强性插件)

用Vista好长好长时间了&#xff0c;除了比较吃硬件、老的游戏不兼容、我350W像素的老罗技不能用等等&#xff0c;感觉不是非常不错的。IE 7也还可以&#xff0c;后来我试用了傲游、火狐&#xff0c;在多标签后傲游的一些操作更人性化&#xff0c;我最喜欢它的托拉即可自动出新标…

CENTOS7 Python3.7 PyAudio 安装

2019独角兽企业重金招聘Python工程师标准>>> 出现错误: gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -fPIC -I/usr/local/python371/include/python3.7m -c src/_portaudiomodule.c -o build/temp.linux-aarch64-3.7/src/…

bash for循环_Bash 中的 For 循环

循环是编程语言的基本概念之一。当你想要一遍又一遍地运行一系列命令直到达到某个条件后终止退出时&#xff0c;循环很方便。在诸如 Bash 之类的脚本语言中&#xff0c;循环对于自动执行重复性任务非常有用。在 Bash 脚本中有3个基本的循环结构&#xff0c;for 循环&#xff0c…

Atlas Unknown Error

if("using Atlas" and "there are some js codes in HEAD tag") then "Unknown Error" solution: copy the js codes to other position 转载于:https://www.cnblogs.com/JoeHou/archive/2009/02/03/1383231.html

软件工程师的6年总结

“又是一年毕业时”&#xff0c;看到一批批学子离开人生的象牙塔&#xff0c;走上各自的工作岗位&#xff1b;想想自己也曾经意气风发、踌躇满志&#xff0c;不觉感叹万千……本文是自己工作6年的经历沉淀或者经验提炼&#xff0c;希望对所有的软件工程师们有所帮助&#xff0c…

linux 信号_Linux的信号和线程

Linux的信号和线程-Tech Talk 让技术发出声音​www.ttalk.im什么是线程线程&#xff0c;有时被称为轻量级进程(Lightweight Process&#xff0c;LWP&#xff09;&#xff0c;是程序执行流的最小单元。一个标准的线程由线程ID&#xff0c;当前指令指针(PC&#xff09;&#xff0…