博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Arrays.asList的实现
阅读量:6160 次
发布时间:2019-06-21

本文共 2823 字,大约阅读时间需要 9 分钟。

  hot3.png

今天看Java编程思想看到容器这块的时候,发现说了Arrays.asList方法的一些特别之处,所以写篇博文来记录一下。

Arrays是一个数组的工具类,用于操作数组。

public static <T> List<T> Arrays.asList(T... a) 这是asList的方法定义。意思就是传入类型为T的数组或者多个T类型的变量参数,就会返回一个List<T>的对象。

Java编程思想上是这么说的:"你可以使用Arrays.asList方法的输出作为List使用,但是其底层表示的是数组,因此不能调整尺寸,如果你试图用add和delete方法在列表中添加和删除元素就有可能会引发去修改数组的尺寸尝试,因此,你将会在运行时获得Unsupported Operation异常"。

那么,首先我来来通过简单的测试来看看这句话的正确性:

public class ArraysTest {    public static void main(String[] args){        List
aList = Arrays.asList(1,2); for(int i : aList){ System.out.println(i); } aList.add(3); }}
看一下运行的结果:
12Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at com.zhu.util.ArraysTest.main(ArraysTest.java:17) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
好吧,果不其然。异常抛出!接下来,我们看看源码,为什么会出现这种情况 
@SafeVarargspublic static 
List
asList(T... a) { return new ArrayList<>(a);}/** * @serial include */private static class ArrayList
extends AbstractList
implements RandomAccess, java.io.Serializable{ private static final long serialVersionUID = -2764017481108945198L; private final E[] a; ArrayList(E[] array) { if (array==null) throw new NullPointerException(); a = array; } public int size() { return a.length; } public Object[] toArray() { return a.clone(); } public
T[] toArray(T[] a) { int size = size(); if (a.length < size) return Arrays.copyOf(this.a, size, (Class
) a.getClass()); System.arraycopy(this.a, 0, a, 0, size); if (a.length > size) a[size] = null; return a; } public E get(int index) { return a[index]; } public E set(int index, E element) { E oldValue = a[index]; a[index] = element; return oldValue; } public int indexOf(Object o) { if (o==null) { for (int i=0; i
 Arrays.asList返回的是本身静态内部类ArrayList,而不是我们经常使用的java.util.ArrayList。看看这内部类的实现,直接是将构造器传进来的数组直接作为存储数据的基础。而add和delete方法是用的是父类AbstractList的实现。

父类AbstractList中的add方法实现

public boolean add(E e) {    add(size(), e);    return true;}public void add(int index, E element) {    throw new UnsupportedOperationException();}

以此可见在AbstractList中是不支持add的实现的。 

转载于:https://my.oschina.net/antin/blog/704409

你可能感兴趣的文章
重装mysql遇到的问题
查看>>
畅捷通T3、T6服务器系统环境重装工作流程
查看>>
LDS文件格式分析
查看>>
redhat7基本命令操作
查看>>
Laravel- 数据库迁移
查看>>
高考前几天我们应该干什么?
查看>>
网络排错实践(一)
查看>>
MySQL 数据类型
查看>>
头文件
查看>>
ubuntu开启SSH服务和允许root远程SSH登录
查看>>
如何让 Hyper-V 和 VMware 虚拟机软件共存?
查看>>
从发小(一起长大的玩伴)聚会引发的思考
查看>>
Geolocation :基于浏览器的定位服务
查看>>
[Object-C语言随笔之一]Mac os 下搭建iOS开发环境
查看>>
spring项目的 WebApplicationContext 初始化两次的解决方法
查看>>
Android系统从驱动到上层服务再到应用的两种服务架构方式
查看>>
Ubuntu 14.04 安装flash插件;安装Cairo-Dock; 美化为Mac
查看>>
产品预览
查看>>
ServletContext对象
查看>>
XENSERVER 图形界面安装Linux
查看>>