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,一经查实,立即删除!

相关文章

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

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

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

在单片机系统里&#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…

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

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

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

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

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…

linux 信号_Linux的信号和线程

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

python 数据结构

一. 深入链表 先来介绍一些链表具备的一些常用方法&#xff1a; append(x) : 把一个元素添加到链表的结尾 extend(L) : 将另外一个链表合并到该链表中 insert(i,x) : 插入一个元素到指定位置的前面 remove(x) : 删除链表中第一个值为x的元素 如果没有这样的元素 则返回错误 pop…

go语言项目优化(经验之谈)

1 Go的应用场景 在斗鱼我们将GO的应用场景分为以下三类&#xff0c;缓存类型数据&#xff0c;实时类型数据&#xff0c;CPU密集型任务。这三类应用场景都有着各自的特点。 ● 缓存类型数据在斗鱼的案例就是我们的首页&#xff0c;列表页&#xff0c;这些页面和接口的特点是不同…

python交互界面用图片当背景_wxPython实现窗口用图片做背景

本文实例为大家分享了wxPython实现窗口用图片做背景的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 效果图&#xff1a;实现代码&#xff1a; #!/usr/bin/env python # -*- encoding:utf-8 -*- import wx class MyPanel(wx.Panel): def __init__(self,parent,id): …

c 字符串转数字_C语言实现十进制转216进制、十六进制转十进制

1、十进制转2&#xff5e;16进制【问题描述】从键盘输入十进制整数num及转换的进制数base&#xff0c;将整数num转换为base进制(base取值范围为 2&#xff5e;16)。方法为&#xff1a;十进制数除base取余法&#xff0c;即十进制数除以base&#xff0c;余数为权位上的数&#xf…

一个简单的LINQ TO XML, AJAX 例子[译]

这个教程是用Visual Studio.net 2008建立&#xff0c;也可以使用VS2005&#xff0c;但你需要从这里下载安装Microsofts ASP.NET AJAX Extensions&#xff0c;AJAX和LINQ是微软目前主要焦点&#xff0c;两个看上去不足为奇&#xff0c;但背后都隐藏着巨大的潜力和力量。在这个示…

python3性能还低吗_Python3 vs. Python2 大作战,谁将是性能之王?

渲染 HTML 模板 django_html 测试将使用 Django 模板渲染引擎来构建一个 150x150 的 HTML 表格。 它利用了 Django 引擎的 Content 和 Template 类。如图所示&#xff0c;Python 3.7 比 Python 2.7 快 1.19 倍&#xff0c;但除此之外&#xff0c;其他 Python 3 版本都没有 Pyth…

python day08

一 文件处理补充 控制文件中光标移动 1 f.read(n): l.文件打开方式为文本模式的时,代表读取N个字符 ll.文件打开方式为b模式时,读取N个字节 强调:只有在read(n)模式下 N代表字符个数,除此之外的是以字节为单位 2 f.seek(): 光标移动是以字节为单位的整数移动. 三种模式:(分别为…

VSCode 小鸡汤 第00期 —— 安装和入门

简介 这将是一个新的系列&#xff0c;将会以 Visual Studio Code&#xff08;后文都简称为 VSCode 啦&#xff09;的操作&#xff0c;环境配置&#xff0c;插件介绍为主&#xff0c;为大家不定期的介绍 VSCode 的一些操作技巧&#xff0c;所以取名 VSCode 小鸡汤&#xff0c;本…

一次缓存性能问题排查

概述以下分享的都跳过了很多坑&#xff0c;包括redis、tomcat环境配置、机器硬件配置等等问题&#xff08;与线上保持一致&#xff0c;或者硬件性能减配系数&#xff0c;例如线上&#xff1a;8C16G&#xff0c;压测&#xff1a;4C8G&#xff0c;系数简单相差2倍&#xff09;&am…

再读新疆系列(六)——吹拂“卡拉库里湖”的风

一下飞机&#xff0c;导游王雪作了简短的自我介绍&#xff0c;马不停蹄地带着我们经喀什市区直接向帕米尔高原的“卡拉库里”湖走。 问午饭在哪吃&#xff1f; 答&#xff1a;“湖边”。 “几点能到&#xff1f;” “大约下午二点多。”妈呀&#xff0c;又经历一次残酷的饥饿历…

记录一次webpack3升级到webpack4过程

升级之前也参考了一些网上的教程。借鉴之&#xff0c;进行的自己的升级。一些版本为什么设为那个版本号也是参考别人的结果。 整体是按照先升级npm run dev&#xff1b;在升级npm run build的顺序。 首先升级webpack&#xff0c;在package.json文件中将webpack版本号修改为4.8.…