判读一个对象不为空_ArrayList实现分析(一)——对象创建
ArrayList是java中最常用的集合類之一,它的內(nèi)部實(shí)現(xiàn)是基于數(shù)組,因此ArryList可以根據(jù)索引實(shí)現(xiàn)隨機(jī)訪問(wèn)。ArryList繼承了AbstractList類,并且實(shí)現(xiàn)了List, RandomAccess, Cloneable接口。下面詳細(xì)分析一下ArrayList的實(shí)現(xiàn),下面的分析是基于JDK1.8版本。
ArrayList對(duì)象創(chuàng)建
ArryList有三個(gè)構(gòu)造函數(shù):
//創(chuàng)建一個(gè)默認(rèn)大小的ArrayListpublic ArrayList() //創(chuàng)建一個(gè)initialCapacity大小的 ArrayListpublic ArrayList(int initialCapacity) //使用其他Collection對(duì)象,創(chuàng)建arrayListpublic ArrayList(Collection extends E> c)下面具體分析一下,每個(gè)構(gòu)造方法是如何創(chuàng)建一個(gè)ArrayList對(duì)象,在深入構(gòu)造方法之前,先看一下ArrayList幾個(gè)重要的成員變量:
//實(shí)際存儲(chǔ)數(shù)據(jù)的數(shù)組transient Object[] elementData; //列表實(shí)際存儲(chǔ)數(shù)據(jù)元素的個(gè)數(shù)private int size;//定義在AbstractList類中,//表示了隊(duì)列結(jié)構(gòu)修改的次數(shù),主要是當(dāng)隊(duì)列大小發(fā)生變化時(shí),//記錄變化次數(shù)protected transient int modCount = 0;//用于表示空實(shí)例的空數(shù)組對(duì)象實(shí)現(xiàn)private static final Object[] EMPTY_ELEMENTDATA = {};//表示創(chuàng)建默認(rèn)大小的ArrayList實(shí)例,//主要是于EMPTY_ELEMENTDATA做區(qū)別,//個(gè)人認(rèn)為EMPTY_ELEMENTDATA表示空ArrayList//DEFAULTCAPACITY_EMPTY_ELEMENTDATA表示是//默認(rèn)大小的ArrayList,沒(méi)有本質(zhì)上的區(qū)別private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};注意:對(duì)modCount字段用法說(shuō)明參考ArrayList實(shí)現(xiàn)分析(二)——常用操作和ConcurentModificationException異常
在熟悉了上面的幾個(gè)字段,下面先看第一個(gè)構(gòu)造函數(shù):ArrayList()
少說(shuō)廢話,先看東西:
從代碼上就可以直接看到了DEFAULTCAPACITY_EMPTY_ELEMENTDATA的用法,把它賦值給了elementData,也就是相當(dāng)于
elementData = {},創(chuàng)建了一個(gè)包含零個(gè)元素的數(shù)組。
第二個(gè)構(gòu)造函數(shù):ArrayList(int initialCapacity) ,同樣先看東西:
public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); }}在構(gòu)造方法中,根據(jù)傳入的initialCapacity值分別進(jìn)行不同的操作,如果是大于0,那么直接創(chuàng)建一個(gè)initialCapacity大小的數(shù)組對(duì)象,如果是等于0,那就使用EMPTY_ELEMENTDATA,這里就是使用上面說(shuō)的EMPTY_ELEMENTDATA這個(gè)成員變量賦值,主要是為了代碼描述的更清晰;如果是小于0就拋出異常。
第三個(gè)構(gòu)造函數(shù):ArrayList(Collection extends E> c)
使用這個(gè)構(gòu)造函數(shù),首先是講傳入的集合對(duì)象c通過(guò)toArray()方法把c轉(zhuǎn)換為Object數(shù)組類型賦值給elementData,這里還增加了一個(gè)判斷,就是判斷賦值后的elementData大小是否為0,如果是0表示,傳入的集合對(duì)象c包含0個(gè)元素,那么使用EMPTY_ELEMENTDATA給elementData復(fù)制,如果傳入的集合對(duì)象c不為空,那么需要再對(duì)elementData的實(shí)際類型進(jìn)行判斷,因?yàn)楦鶕?jù)源碼中注釋,在執(zhí)行c.toArray()的時(shí)候,可能返回的類型不是 Object[].class,這是jdk的bug(經(jīng)過(guò)查閱,該bug在jdk9已經(jīng)修復(fù)),因此這里需要再次判斷一下elementData的類型是否是Object[],如果不是,那么需要利用elementData當(dāng)前的值,重新創(chuàng)建一個(gè)Object[]類型的數(shù)組,并用 elementData指向新的數(shù)組地址。
注意Arrays.copyOf(elementData, size, Object[].class)方法的作用是使用elementData數(shù)組,創(chuàng)建一個(gè)新的數(shù)組,該數(shù)組的大小是size,類型是Object[].class
本文先介紹ArrayList的創(chuàng)建過(guò)程,下一篇文章,重點(diǎn)分析一下ArrayList的常用操作。
總結(jié)
以上是生活随笔為你收集整理的判读一个对象不为空_ArrayList实现分析(一)——对象创建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 京东ajax怎么用,使用Ajax、jso
- 下一篇: python的kite下载安装及使用_K