java 集合与数组的互转方法,与源码分析
前言
java数组与集合需要互相转换的场景非常多,但是运用不好还是容易抛出UnSupportedOperationException。下面讲解一下互转的方法,以及结合源码分异常产生的原因
集合转数组
List<String> strList = new ArrayList<>(10);
strList.add("aa");
strList.add("bb");
strList.add("cc");
String[] strArray1 = new String[2];
strList.toArray(strArray1);
for (String st : strArray1) {
System.out.println(st);
}
上段代码的运行结果为

为什么数组中是空值呢,明明已经通过toArray()赋值了啊,我们去看一下源码
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
可以明显的看到,当传入的数组的大小小于集合的大小时,会返回一个新创建的数组,不会执行arraycopy方法,所以会出现数组中元素为空的情况,看了源码之后,想必大家都知道该怎么做了,只要数组的大小能容纳下集合的大小即可。
List<String> strList = new ArrayList<>(10);
strList.add("aa");
strList.add("bb");
strList.add("cc");
String[] strArray1 = new String[strList.size()];
strList.toArray(strArray1);
for (String st : strArray1) {
System.out.println(st);
}
上述代码运行结果为

数组转集合
String[] strArray = new String[3];
for (int i = 0; i<strArray.length; i++) {
strArray[i] = "a"+i;
}
List<String> strList = new ArrayList<>(10);
strList = Arrays.asList(strArray);
strList.set(0,"a00");
for (String str :strList) {
System.out.println(str);
}
Thread.sleep(2000);
strList.remove(2);
strList.add("111");
在数组转为集合的时候,方法如上,编译通过,运行结果如下

可以明显的看到,我们在设置值与取值的时候是没有问题的,UnsupportedOperationException这个异常产生在对集合进行remove和add操作的时候,下面我们查看一下Arrays工具类中的asList() 源码
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
可以看到,在Arrays类中,asList返回的是一个ArrayList对象,这就很奇怪了,既然是ArrayList对象,为什么不能进行add和remove操作呢,我们仔细看了该ArrayList对象才发现,此ArrayList是Arrays类
中的一个内部类,根据就近原则,asList()返回的实际上是该内部类对象,并非java.util下的ArrayList.
我们再看一下关系图


可以发现,内部类的ArrayList实则是没有add和remove方法,但是在调用的时候编译并没有报错,所以说实际上,该ArrayList对象调用的是父类AbstractList中的remove和add方法,接着我们继续去看AbstractList类中,这两个方法的源码
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
public E remove(int index) {
throw new UnsupportedOperationException();
}
看到这里想必大家都明白了异常产生的源头。
总结
数组和集合的互转非常简单,但是在使用的过程中应该注意到其中容易产生的 UnsupportedOperationException,通过源码应该对该过程有个清楚的认识。
java 集合与数组的互转方法,与源码分析的更多相关文章
- Java并发包中Semaphore的工作原理、源码分析及使用示例
1. 信号量Semaphore的介绍 我们以一个停车场运作为例来说明信号量的作用.假设停车场只有三个车位,一开始三个车位都是空的.这时如果同时来了三辆车,看门人允许其中它们进入进入,然后放下车拦.以后 ...
- jQuery原型方法.pushStack源码分析
这次分析的方法跟前面不同,虽然pushStack也是原型方法之一,但是我们几乎从不用在页面调用,在参考手册里面也没有这个方法的使用说明,但是这个方法还是非常重要的,在使用很多jQuery的其他方式都会 ...
- 转!!Java学习之自动装箱和自动拆箱源码分析
自动装箱(boxing)和自动拆箱(unboxing) 首先了解下Java的四类八种基本数据类型 基本类型 占用空间(Byte) 表示范围 包装器类型 boolean 1/8 true|fal ...
- Java显式锁学习总结之六:Condition源码分析
概述 先来回顾一下java中的等待/通知机制 我们有时会遇到这样的场景:线程A执行到某个点的时候,因为某个条件condition不满足,需要线程A暂停:等到线程B修改了条件condition,使con ...
- Java显式锁学习总结之五:ReentrantReadWriteLock源码分析
概述 我们在介绍AbstractQueuedSynchronizer的时候介绍过,AQS支持独占式同步状态获取/释放.共享式同步状态获取/释放两种模式,对应的典型应用分别是ReentrantLock和 ...
- Java学习之自动装箱和自动拆箱源码分析
自动装箱(boxing)和自动拆箱(unboxing) 首先了解下Java的四类八种基本数据类型 基本类型 占用空间(Byte) 表示范围 包装器类型 boolean 1/8 true|false ...
- RxJava2 中多种取消订阅 dispose 的方法梳理( 源码分析 )
Github 相关代码: Github地址 一直感觉 RxJava2 的取消订阅有点混乱, 这样也能取消, 那样也能取消, 没能系统起来的感觉就像掉进了盘丝洞, 迷乱… 下面说说这几种情况 几种取消的 ...
- 【Android笔记】Thread类中关于join()方法的源码分析
1.join()方法的作用: 例如有一个线程对象为Thread1,在main()方法中调用Thread1.join()方法可使得当前线程(即主线程)阻塞,而执行Thread1线程. 2.源码分析(以上 ...
- Java显式锁学习总结之四:ReentrantLock源码分析
概述 ReentrantLock,即重入锁,是一个和synchronized关键字等价的,支持线程重入的互斥锁.只是在synchronized已有功能基础上添加了一些扩展功能. 除了支持可中断获取锁. ...
随机推荐
- 剑指offer-面试题32-分行从上到下打印二叉树-二叉树遍历
/* 题目: 分行按层自上向下打印二叉树. */ /* 思路: 使用队列,将节点压入队列中,再弹出来,压入其左右子节点,循环,直到栈为空. 添加两个计数器,current记录当前行的节点数,next记 ...
- 深度优先搜索DFS---求出矩阵中“块”的个数。
题目: 给出一个 m x n 的矩阵,矩阵中的元素为0或1.如果矩阵中有若干个 1是相邻的,那么称这些1构成了一个“块”.求给定的矩阵中“块”的个数. 0 0 0 0 0 0 0 0 0 0 0 0 ...
- 使用INF创建CSR文件
公司要为一个英国的客户提供由HTTP升级到HTTPS的服务,于是接触到了申请SSL证书这方面的内容. 一.总的来说,申请证书需要两步,一是创建CSR文件,二是在证书提供商购买证书并将CSR文件发给证书 ...
- APC BK650 RJ50-USB数据线引脚定义
WHY 群晖NAS配套购入APC BK650-CH UPS电源,一根线实现UPS-NAS通讯. 考虑到自带的USB连接线可能损坏,记录引脚定义供DIY之需. UPS BK650采用10芯RJ-50接口 ...
- VMware、Linux(CentOS 7)安装,供参考。
前端开发,学习Linux,记录安装中的一些问题,比如在安装最小版后,如何由命令行转为图形界面等. -------------笔记中截图参考其他资料. 下载文件 VMware 12: 链接:https: ...
- .net mvc 多文件上传
1.input文件上传设置允许选择多个文件,设置属性 multiple即可 <input type="file" multiple="multiple" ...
- 《The good doctor》视频笔记
第一季 第一弹可以看 角色 肖恩莫非 梅伦德斯 克莱尔·布朗 贾里德·卡鲁 道格拉斯院长 卡莉 青木 一个很厉害的女实习医生,忘记名字了 病理知识 自闭症:由于神经系统失调导致的发育障碍,其病征包括不 ...
- python三器
1.1 装饰器 1.装饰器的作用 1. 装饰器作用:本质是函数(装饰其他函数)就是为其他函数添加其他功能 2. 装饰器必须准寻得原则: 1)不能修改被装饰函数的源代码 2)不能修改被装饰函数的调用方式 ...
- Time series data mining
from here 论文Timeseries data mining(2012)中提出:时间序列数据挖掘包括7个基本任务和3个基础问题: 7 tasks: query by content clust ...
- paramiko 基于密钥文件登陆
首先密钥登陆远程的原理 client 端 将公钥放在远程机器authorized_keys: 使用 ssh-copy-id app@ip 接着在client机器生成密钥 使用ssh-keygen - ...