Arrays.asList的源码分析
以前一直很奇怪为什么Arrays.asList的数组不能插入新的数据,后来看了源码发现是因为内部是一个final的数组支持起来的Arraylist,下面贴入源码与分析。
1.先看Arrays的方法
我们看到Arrays.aslist 返回一个new ArrayList<>(a);
@SafeVarargs public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
2.我们按住ctrl点击这个ArrayList
发现这个ArrayList不是java.util中的Arraylist而是在Arrays这个类中的一个私有静态类并且继承了AbstractList,
这个类中的set和get方法其实是基于private final E[] a 这个泛型数组的;
private static class ArrayList<E> extends AbstractList<E> //私有静态类 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 E get(int index) {//得到数组中的值 return a[index]; } public E set(int index, E element) {//替换数组中的值 E oldValue = a[index]; a[index] = element; return oldValue; }
......... }
3.等等我们并没有看到add和remove方法呀。淡定,按住ctrl点击这个AbstractList,既然子类中没有方法体,那一定是在父类中实现的
我们发现在父类中,这2个方法都是会抛出异常的(这些会抛出异常的方法称为可选操作)。所以才不能使用这2个方法。但是其实想想为什么要这样子设计呢。为什么不直接设计成抽象的方法呢,为什么要抛出异常呢。
我们要知道会有很多类继承这个AbstractList,有些方法对于有些类是没有意义的,就比如说我们上面这个基于数组的ArrayList,既然基于数组我是必然不能改变数组的大小(数组大小固定),所以所有的会改变数组大小的方法都会抛出UnsupportedOperationException()这个异常。这些没有意义的方法我就没有必要重写,如果变成抽象方法的话重写会很繁琐。并且事先给定了各种接口可以防止继承类接口膨胀,因为继承类可以随意的创造自己的方法而不受约束,但是事先给定了可选操作,就会重写可选操作,使容器类的使用变得轻松
public void add(int index, E element) { throw new UnsupportedOperationException(); } public E remove(int index) { throw new UnsupportedOperationException(); }
4.如果希望list可以添加删除
可以把Arrays.asList()作为Arraylist的参数传入就像下面这样子
new ArrayList<>(Arrays.asList("1","2"));
以上均只是个人看法,如有不准确的地方,欢迎大家一起讨论Haha
Arrays.asList的源码分析的更多相关文章
- Arrays工具类使用与源码分析(1)
Arrays工具类主要是方便数组操作的,学习好该类可以让我们在编程过程中轻松解决数组相关的问题,简化代码的开发. Arrays类有一个私有的构造函数,没有对外提供实例化的方法,因此无法实例化对象.因为 ...
- 【集合框架】JDK1.8源码分析之Collections && Arrays(十)
一.前言 整个集合框架的常用类我们已经分析完成了,但是还有两个工具类我们还没有进行分析.可以说,这两个工具类对于我们操作集合时相当有用,下面进行分析. 二.Collections源码分析 2.1 类的 ...
- 7.Java集合-Arrays类实现原理及源码分析
Java集合---Arrays类源码解析 转自:http://www.cnblogs.com/ITtangtang/p/3948765.html 一.Arrays.sort()数组排序 Java A ...
- 设计模式(二十三)——策略模式(Arrays源码分析)
1 编写鸭子项目,具体要求如下: 1) 有各种鸭子(比如 野鸭.北京鸭.水鸭等, 鸭子有各种行为,比如 叫.飞行等) 2) 显示鸭子的信息 2 传统方案解决鸭子问题的分析和代码实现 1) 传统的设计方 ...
- 【集合框架】JDK1.8源码分析之LinkedList(七)
一.前言 在分析了ArrayList了之后,紧接着必须要分析它的同胞兄弟:LinkedList,LinkedList与ArrayList在底层的实现上有所不同,其实,只要我们有数据结构的基础,在分析源 ...
- 【集合框架】JDK1.8源码分析之Comparable && Comparator(九)
一.前言 在Java集合框架里面,各种集合的操作很大程度上都离不开Comparable和Comparator,虽然它们与集合没有显示的关系,但是它们只有在集合里面的时候才能发挥最大的威力.下面是开始我 ...
- Spring源码分析——BeanFactory体系之抽象类、类分析(二)
上一篇分析了BeanFactory体系的2个类,SimpleAliasRegistry和DefaultSingletonBeanRegistry——Spring源码分析——BeanFactory体系之 ...
- Solr4.8.0源码分析(22)之SolrCloud的Recovery策略(三)
Solr4.8.0源码分析(22)之SolrCloud的Recovery策略(三) 本文是SolrCloud的Recovery策略系列的第三篇文章,前面两篇主要介绍了Recovery的总体流程,以及P ...
- 【Zookeeper】源码分析之持久化--FileTxnLog
一.前言 前一篇已经分析了序列化,这篇接着分析Zookeeper的持久化过程源码,持久化对于数据的存储至关重要,下面进行详细分析. 二.持久化总体框架 持久化的类主要在包org.apache.zook ...
随机推荐
- Android:控件布局(相对布局)RelativeLayout
RelativeLayout是相对布局控件:以控件之间相对位置或相对父容器位置进行排列. 相对布局常用属性: 子类控件相对子类控件:值是另外一个控件的id android:layout_above-- ...
- C#基础精华05(正则表达式,)
正则表达式 . 任意一个字符 除了\n以外的 [] [0-9] [0-9a-zA-Z] | 或 [0-9]|[a-z] () 提升优先级别 分组 ([a]|[0-9])[0 ...
- 如何修改linux系统主机名称
完成目标: 修改centos 7系统的主机名称 使用命令: hostnamectl [root@ossec-server ~]# hostnamectl --help hostnamectl [OPT ...
- How to download apk for google play online?
http://apps.evozi.com/apk-downloader/ Online APK Downloader http://apkpure.com/ apkpure http://www.c ...
- Complete The Pattern #6 - Odd Ladder
Complete The Pattern #6 - Odd Ladder Task: You have to write a function pattern which creates the fo ...
- js模仿jquery里的几个方法next, pre, nextAll, preAll
/*siblings函数, 选取node的所有兄弟节点*/ function siblings(node){ if(node.nodeType === 1){ node.flag = true; // ...
- poj2014 不带修改区间第k大树
主席树 又称函数式线段树,又称可持久化线段树……缺点是内存有点儿大…… type node1=record l,r,sum:longint; end; node2=record x,idx:longi ...
- Ajax时代 SQL注入依然是隐患
许多网站程序在编写时,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患.用户可以提交一段数据库查询代码(一般是在浏览器地址栏进行,通过正常的www端口访问),根据程序返回的结果,获得某些想得 ...
- mysql修改表、字段、库的字符集
在一次导入数据表(MYISAM)的经历:复制过来的表打开后中文出现乱码,肯定是字符集出现了不致的问题,所以从原数据库导出.sql文件,修改其中的创建表的语句,加入字符集DEFAULT CHARSET= ...
- css页面重构面试题
偶然间又看到博客园中这两道页面重构面试题.题一:分别用2个DIV,3个DIV,5个DIV实现水平垂直均居中显示一个宽50px,高200px的正十字架.思路:水平垂直均居中的实现,当然非absolute ...