欢迎来到天天文库
浏览记录
ID:10213431
大小:96.79 KB
页数:9页
时间:2018-06-12
《jdk1.8源码分析之arraylist》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、仁人教育JDK1.8源码分析之ArrayList一、前言 分析了Map中主要的类之后,下面我们来分析Collection下面几种常见的类,如ArrayList、LinkedList、HashSet、TreeSet等。下面通过JDK源码来一起分析ArrayList底层是如何实现的。(PS:把JVM看完了之后终于可以有成片的时间来阅读源码了,感觉简直不能更爽)。二、ArrayList数据结构 分析一个类的时候,数据结构往往是它的灵魂所在,理解底层的数据结构其实就理解了该类的实现思路,具体的实现细节再具体分析。 ArrayList的数据结构如下: 说明:底层的数据结构就是数组,数
2、组元素类型为Object类型,即可以存放所有类型数据。我们对ArrayList类的实例的所有的操作底层都是基于数组的。下面我们来分析通过数组是如何保证库函数的正确实现的。三、ArrayList源码分析 3.1类的继承关系publicclassArrayListextendsAbstractListimplementsList,RandomAccess,Cloneable,java.io.Serializable 说明:ArrayList继承AbstractList抽象父类,实现了List接口(规定了List的操作规范)、RandomAccess(可随机访问)、Cl
3、oneable(可拷贝)、Serializable(可序列化)。 3.2类的属性 publicclassArrayListextendsAbstractListimplementsList,RandomAccess,Cloneable,java.io.Serializable仁人教育仁人教育{//版本号privatestaticfinallongserialVersionUID=8683452581122892189L;//缺省容量privatestaticfinalintDEFAULT_CAPACITY=10;//空对象数组privatestaticfinal
4、Object[]EMPTY_ELEMENTDATA={};//缺省空对象数组privatestaticfinalObject[]DEFAULTCAPACITY_EMPTY_ELEMENTDATA={};//元素数组transientObject[]elementData;//实际元素大小,默认为0privateintsize;//最大数组容量privatestaticfinalintMAX_ARRAY_SIZE=Integer.MAX_VALUE-8;}ViewCode 说明:类的属性中核心的属性为elementData,类型为Object[],用于存放实际元素,并且被标记为tran
5、sient,也就意味着在序列化的时候,此字段是不会被序列化的。 3.3类的构造函数 1.ArrayList(int)型构造函数 publicArrayList(intinitialCapacity){if(initialCapacity>0){//初始容量大于0this.elementData=newObject[initialCapacity];//初始化元素数组}elseif(initialCapacity==0){//初始容量为0this.elementData=EMPTY_ELEMENTDATA;//为空对象数组}else{//初始容量小于0,抛出异常thrownewI
6、llegalArgumentException("IllegalCapacity:"+initialCapacity);}}ViewCode仁人教育仁人教育 说明:指定elementData数组的大小,不允许初始化大小小于0,否则抛出异常。 2.ArrayList()型构造函数 publicArrayList(){//无参构造函数,设置元素数组为空this.elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}ViewCode 说明:当未指定初始化大小时,会给elementData赋值为空集合。 3.ArrayList(Collectio
7、n)型构造函数 publicArrayList(Collectionc){//集合参数构造函数elementData=c.toArray();//转化为数组if((size=elementData.length)!=0){//参数为非空集合if(elementData.getClass()!=Object[].class)//是否成功转化为Object类型数组elementData=Arrays.
此文档下载收益归作者所有