前言

   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 集合与数组的互转方法,与源码分析的更多相关文章

  1. Java并发包中Semaphore的工作原理、源码分析及使用示例

    1. 信号量Semaphore的介绍 我们以一个停车场运作为例来说明信号量的作用.假设停车场只有三个车位,一开始三个车位都是空的.这时如果同时来了三辆车,看门人允许其中它们进入进入,然后放下车拦.以后 ...

  2. jQuery原型方法.pushStack源码分析

    这次分析的方法跟前面不同,虽然pushStack也是原型方法之一,但是我们几乎从不用在页面调用,在参考手册里面也没有这个方法的使用说明,但是这个方法还是非常重要的,在使用很多jQuery的其他方式都会 ...

  3. 转!!Java学习之自动装箱和自动拆箱源码分析

    自动装箱(boxing)和自动拆箱(unboxing)   首先了解下Java的四类八种基本数据类型   基本类型 占用空间(Byte) 表示范围 包装器类型 boolean 1/8 true|fal ...

  4. Java显式锁学习总结之六:Condition源码分析

    概述 先来回顾一下java中的等待/通知机制 我们有时会遇到这样的场景:线程A执行到某个点的时候,因为某个条件condition不满足,需要线程A暂停:等到线程B修改了条件condition,使con ...

  5. Java显式锁学习总结之五:ReentrantReadWriteLock源码分析

    概述 我们在介绍AbstractQueuedSynchronizer的时候介绍过,AQS支持独占式同步状态获取/释放.共享式同步状态获取/释放两种模式,对应的典型应用分别是ReentrantLock和 ...

  6. Java学习之自动装箱和自动拆箱源码分析

    自动装箱(boxing)和自动拆箱(unboxing) 首先了解下Java的四类八种基本数据类型   基本类型 占用空间(Byte) 表示范围 包装器类型 boolean 1/8 true|false ...

  7. RxJava2 中多种取消订阅 dispose 的方法梳理( 源码分析 )

    Github 相关代码: Github地址 一直感觉 RxJava2 的取消订阅有点混乱, 这样也能取消, 那样也能取消, 没能系统起来的感觉就像掉进了盘丝洞, 迷乱… 下面说说这几种情况 几种取消的 ...

  8. 【Android笔记】Thread类中关于join()方法的源码分析

    1.join()方法的作用: 例如有一个线程对象为Thread1,在main()方法中调用Thread1.join()方法可使得当前线程(即主线程)阻塞,而执行Thread1线程. 2.源码分析(以上 ...

  9. Java显式锁学习总结之四:ReentrantLock源码分析

    概述 ReentrantLock,即重入锁,是一个和synchronized关键字等价的,支持线程重入的互斥锁.只是在synchronized已有功能基础上添加了一些扩展功能. 除了支持可中断获取锁. ...

随机推荐

  1. cf1037E

    题解:考虑逆序处理询问,用一个set来维护能去的人,每次减少边的时候,维护一下这个set就可以,具体看代码 int main(){ int n, m, k; cin >> n >&g ...

  2. kali安装后中文乱码

    参考: 文章一:https://blog.csdn.net/dust_hk/article/details/103299136?depth_1-utm_source=distribute.pc_rel ...

  3. 安装Kubernetes到CentOS(Minikube)

    运行环境 系统版本:CentOS Linux release 7.6.1810 (Core) 软件版本:Docker-ce-18.06.0.Kubectl-1.15.0.Kubernetes-v1.1 ...

  4. Wannafly Winter Camp 2020 Day 6H 异或询问 - 二分

    给定一个长 \(n\) 的序列 \(a_1,\dots,a_n\),定义 \(f(x)\) 为有多少个 \(a_i \leq x\) 有 \(q\) 次询问,每次给定 \(l,r,x\),求 \(\s ...

  5. IIS7配置asp程序

    Windows 中IIS7.IIS7.5是默认不安装的,所以在安装完Windows Vista/windows 7/windows 2008之后如果需要安装IIS7/iis7.5的话,就要自己动手了. ...

  6. EOFError: Compressed file ended before the end-of-stream marker was reached解决办法(在Windows下查看已下载的MNIST数据文件)

    出现这个问题的原因是因为文件下载到一半就中断了,解决办法是删除datasets中下载到一半的数据包. 下面以我遇到的问题为例: 我下载数据下载到最后一个包就没有反应了,于是我强制终止了运行,可能是因为 ...

  7. Costco这样的超级零售商,能不能干掉电商?

    名创优品创始人叶国富曾说过,Costco只是没有来到中国(大陆),如果它来了,中国现在的零售业全部都会"死光".叶国富的话,似乎一语成箴. 随着Costco正式入华,其正在彻底搅动 ...

  8. c语言中 char* 和 unsigned char* 的区别浅析(转)

    原文:https://blog.csdn.net/guotianqing/article/details/77341657 背景最近在项目中遇到了一个编译警告,是因为定义的变量为char[],而在使用 ...

  9. AC自动机(模板+例题)

    首先要明白AC自动机是干什么的: AC自动机其实就是一种多模匹配算法,那么你可能会问什么叫做多模匹配算法.下面是我对多模匹配的理解,与多模与之对于的是单模,单模就是给你一个单词,然后给你一个字符串,问 ...

  10. Centos下安装Oracle12c

    总结一次安装oracle的折腾血泪史环境准备 centos7 虚拟机VMware Workstation Pro14 IP:192.168.245.128(根据实际情况) 4G物理内存,8G虚拟内存, ...