以前一直很奇怪为什么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的源码分析的更多相关文章

  1. Arrays工具类使用与源码分析(1)

    Arrays工具类主要是方便数组操作的,学习好该类可以让我们在编程过程中轻松解决数组相关的问题,简化代码的开发. Arrays类有一个私有的构造函数,没有对外提供实例化的方法,因此无法实例化对象.因为 ...

  2. 【集合框架】JDK1.8源码分析之Collections && Arrays(十)

    一.前言 整个集合框架的常用类我们已经分析完成了,但是还有两个工具类我们还没有进行分析.可以说,这两个工具类对于我们操作集合时相当有用,下面进行分析. 二.Collections源码分析 2.1 类的 ...

  3. 7.Java集合-Arrays类实现原理及源码分析

    Java集合---Arrays类源码解析  转自:http://www.cnblogs.com/ITtangtang/p/3948765.html 一.Arrays.sort()数组排序 Java A ...

  4. 设计模式(二十三)——策略模式(Arrays源码分析)

    1 编写鸭子项目,具体要求如下: 1) 有各种鸭子(比如 野鸭.北京鸭.水鸭等, 鸭子有各种行为,比如 叫.飞行等) 2) 显示鸭子的信息 2 传统方案解决鸭子问题的分析和代码实现 1) 传统的设计方 ...

  5. 【集合框架】JDK1.8源码分析之LinkedList(七)

    一.前言 在分析了ArrayList了之后,紧接着必须要分析它的同胞兄弟:LinkedList,LinkedList与ArrayList在底层的实现上有所不同,其实,只要我们有数据结构的基础,在分析源 ...

  6. 【集合框架】JDK1.8源码分析之Comparable && Comparator(九)

    一.前言 在Java集合框架里面,各种集合的操作很大程度上都离不开Comparable和Comparator,虽然它们与集合没有显示的关系,但是它们只有在集合里面的时候才能发挥最大的威力.下面是开始我 ...

  7. Spring源码分析——BeanFactory体系之抽象类、类分析(二)

    上一篇分析了BeanFactory体系的2个类,SimpleAliasRegistry和DefaultSingletonBeanRegistry——Spring源码分析——BeanFactory体系之 ...

  8. Solr4.8.0源码分析(22)之SolrCloud的Recovery策略(三)

    Solr4.8.0源码分析(22)之SolrCloud的Recovery策略(三) 本文是SolrCloud的Recovery策略系列的第三篇文章,前面两篇主要介绍了Recovery的总体流程,以及P ...

  9. 【Zookeeper】源码分析之持久化--FileTxnLog

    一.前言 前一篇已经分析了序列化,这篇接着分析Zookeeper的持久化过程源码,持久化对于数据的存储至关重要,下面进行详细分析. 二.持久化总体框架 持久化的类主要在包org.apache.zook ...

随机推荐

  1. 设置window窗口的背景色为护眼色

    win7设置:桌面右键 -> 个性化 -> 窗口颜色 -> 高级外观设置 ->  '项目'下拉菜单 ->  '窗口'

  2. jquery.cookie.js使用介绍

    Cookies概述: Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术.Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非 ...

  3. Web开发的绝美网站

    http://paranimage.com/ http://sixrevisions.com/graphics-design/

  4. Python生成器与yield

    列表推导与生成器表达式 当我们创建了一个列表的时候,就创建了一个可以迭代的对象: >>> squares=[n*n for n in range(3)] >>> f ...

  5. (组合数学3.1.2.1)POJ 2249 Binomial Showdown(排列组合公式的实现)

    /* * POJ_2249.cpp * * Created on: 2013年10月8日 * Author: Administrator */ #include <iostream> #i ...

  6. MarshalByRefObject浅析

    首先了解一下不同应用程序域中的对象的通信方式有两种: 一种是跨应用程序域边界传输对象副本 一种是使用代理交换消息. 简单来讲,继承此类的对象可以跨越应用程序域边界被引用,甚至被远程引用. 当一个对象需 ...

  7. 转载:C++ map的基本操作和使用

    声明:本文转自:http://www.cnblogs.com/hailexuexi/archive/2012/04/10/2440209.html 1.map简介 map是一类关联式容器.它的特点是增 ...

  8. poj1823,3667

    又来练线段树了…… poj1823题意很简单(明显的数据结构题),区间修改和统计最长连续空区间: 有了poj3468的基础,区间修改不是什么问题了,重点是求最长连续空区间:(弱弱的我纠结了好久) 在每 ...

  9. HNOI2008玩具装箱 (斜率优化)

    总算A了,心情好激动…… 如果会了一类斜率优化,基本上这类题就成了套模版了…… 只是k函数不同 var n,l,x,tail,head,m:int64; i,j:longint; dp,q,s:..] ...

  10. Innodb buffer pool/redo log_buffer 相关

    InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理.在数据库系统中,由于CPU速度和磁盘速度之前的鸿沟,通常使用缓冲池技术来提高数据库的整体性能. 1. Innodb_buffe ...