ArrayList是Java集合框架中比較常用的一個數據結構,它的底層是是基于數組實現的。
底層說明
ArrayList是List的實現類,它的底層是用Object數組存儲,線程不安全
后期應用
適合用于頻繁的查詢工作,因為底層是數組,可以快速通過數組下標進行查找
區別方向 | ArrayList集合 | LinkedList集合 |
線程安全 | 不安全 | 不安全 |
底層原理 | Object類型數組 | 雙向鏈表 |
隨機訪問 | 支持(實現 RandomAccess接口) | 不支持 |
內存占用 | ArrayList 浪費空間, 底層是數組,末尾預留一部分容量空間 | LinkedList占用空間比ArrayList多,存在頭尾地址值占用空間 |
小結
ArrayList 集合的特點:
1. 線程不安全
2. 底層數據結構是數組(查詢快,增刪慢,支持快速隨機訪問)
3. 內存占用會存在部分浪費,末尾會預留一部分容量空間
代碼
publicclassArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,java.io.Serializable{/***默認初始容量大小,默認初始化容量為10*/privatestaticfinalintDEFAULT_CAPACITY=10;/***空數組。當集合內容置空的時候,底層使用空數組標記*/privatestaticfinalObject[]EMPTY_ELEMENTDATA={};/***用于無參數構造方法,創建對象的時候,使用這個數組定義。*相比上面的數組EMPTY_ELEMENTDATA可以進行區分,知道在添加元素的過程當中,容量增加多少*/privatestaticfinalObject[]DEFAULTCAPACITY_EMPTY_ELEMENTDATA={};/***保存ArrayList數據的數組,這個數組會不斷的改變,前面沒有被final修飾表示地址值會發生的變化*/transientObject[]elementData;//non-privatetosimplifynestedclassaccess/***ArrayList所包含的元素個數,也就是在ArrayList集合底層,通過size()方法,獲取到的元素個數*/privateintsize;}
補充
1.ArrayList集合底層存在6個成員變量還有一個privatestaticfinallongserialversionuid=8683452581122892189L;序列化使用,目前針對于當前的操作過程當中,暫時不會使用得到。2.ArrayList集合當中核心的兩個成員變量A.底層維護數組transientObject[]elementData;B.存儲的元素個數privateintsize;
代碼
publicclassArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,java.io.Serializable{/***構造一個初始長度為0的空數組。*/publicArrayList(){this.elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}/***在構造方法當中,傳遞一個參數集合c,將集合c轉換成為新的列表*elementData當中的數據,就是新集合存放的數據*c.toArray就是將原始集合的數據取出*如果取出的集合長度不為零的情況下,則復制參數集合c到elementData當中*如果取出的集合長度為零的情況下,則賦值為空數組EMPTY_ELEMENTDATA*/publicArrayList(Collection<?extendsE>c){elementData=c.toArray();if((size=elementData.length)!=0){if(elementData.getClass()!=Object[].class)elementData=Arrays.copyOf(elementData,size,Object[].class);}else{this.elementData=EMPTY_ELEMENTDATA;}}/***指定參數的長度大小*如果初始化的長度大于0,則返回新的數組*如果初始化的長度等于0,則返回默認的空數組作為集合this.elementData=EMPTY_ELEMENTDATA;*如果初始化的長度小于0,則出現非法參數異常*/publicArrayList(intinitialCapacity){if(initialCapacity>0){this.elementData=newObject[initialCapacity];}elseif(initialCapacity==0){this.elementData=EMPTY_ELEMENTDATA;}else{thrownewIllegalArgumentException("IllegalCapacity:"+initialCapacity);}}}
補充(一) 無參構造創建對象
補充(二)帶參構造創建對象,帶有int類型參數
補充(三)帶參構造創建對象,帶有 集合類型參數
核心方法介紹
來自于ArrayList集合當中的方法:1.publicbooleanadd(Ee){...}2.privatevoidadd(Ee,Object[]elementData,ints){....}3.privateObject[]grow()4.privateObject[]grow(intminCapacity)來自于其他類當中的功能1.Arrays.copyOf(elementData,newCapacity);表示來自于數組工具類Arrays當中的copyOf()底層使用的是System.arraycopy()方法2.Math.max(DEFAULT_CAPACITY,minCapacity)表示來自于數學工具類Math當中的max()方法,比較兩個數據最大值,取較大者,返回
核心代碼解釋
publicclassArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,java.io.Serializable{/***將指定的元素添加到此集合的末尾位置**modCount是來自于父類的AbstractList當中的成員變量*add(e,elementData,size)調用自己下面的重載方法*returntrue表示當前的方法,一定可以添加成功,因為List系列的集合添加數據都是允許成功的true如果是Set此方法返回false*/publicbooleanadd(Ee){modCount++;add(e,elementData,size);returntrue;}/***這個方法是私有方法,僅僅自己可以使用。不允許外界訪問得到。便于上面的add()方法重載調用的*參數1:表示需要添加的元素數據Ee*參數2:表示成員變量當中,需要維護管理的底層數組Object[]elementData*參數3:表示成員變量當中,size容器elementData當中存放的真實有效的數據個數*方法里面的邏輯:當size已經等于了內部容器elementData的最大長度,則準備進行擴容的操作,擴容使用grow()方法*無論上面是否進行了擴容的操作,這里都需要將添加的元素賦值到數組當中,也就是elementData[s]=e;*并且將當前成員變量的size在原始數據的基礎上面,增加1,表示添加了新的元素之后,長度變化了,增加了1*/privatevoidadd(Ee,Object[]elementData,ints){if(s==elementData.length)elementData=grow();elementData[s]=e;size=s+1;}/***這個方法是私有方法,僅僅自己可以使用。不允許外界訪問得到。便于上面的add()方法調用的*方法的內部調用了ArrayList當中自己重載的方法grow(size+1)同時傳入了參數。*這里參數的含義,表示的是集合當中總長度size+1表示在原始size基礎上增加1*方法的返回值是一個新的數組,也就是擴容之后的數組*/privateObject[]grow(){returngrow(size+1);}/***這個方法是私有方法,僅僅自己可以使用。不允許外界訪問得到。便于上面的grow()方法調用的*這里的參數minCapacity,就是上面傳入的參數size+1,也就是說最小容量minCapacity=size+1*方法體當中的執行邏輯:*1.獲取到了底層維護數組的長度intoldCapacity=elementData.length;這里就是舊容量oldCapacity*2.判斷舊容量oldCapacity是否小于0,也就是else的邏輯,*如果滿足if當中的邏輯,則表示舊數組當中存在數據,并且舊數組并不是默認容量的空數組地址值*說明:擴容過的就不會是之前默認DEFAULTCAPACITY_EMPTY_ELEMENTDATA的地址值*在這種情況下,就會得到1.5被的數組長度整數,傳遞給Arrays.copyOf()方法進行擴容,得到新數組返回*如果滿足else當中的邏輯,則返回DEFAULT_CAPACITY和minCapacity較大值。*說明:DEFAULT_CAPACITY值表示的是成員變量,默認為10*說明:minCapacity在低于10的時候,表示的會是擴容添加的長度1,2,3..9.10.11..*/privateObject[]grow(intminCapacity){intoldCapacity=elementData.length;if(oldCapacity>0||elementData!=DEFAULTCAPACITY_EMPTY_ELEMENTDATA){intnewCapacity=ArraysSupport.newLength(oldCapacity,minCapacity-oldCapacity,/*minimumgrowth*/oldCapacity>>1/*preferredgrowth*/);returnelementData=Arrays.copyOf(elementData,newCapacity);}else{returnelementData=newObject[Math.max(DEFAULT_CAPACITY,minCapacity)];}}}
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
(資料圖片僅供參考)半年多以前,張同學第一次在抖音發短視頻時,還只是一個“平平無奇”的鄉村中年。在城市里開店失敗,回老家養雞的過程也不太順利,他開始短視頻上更新自己的日常,一個院子、一張炕,更多瑣碎但又真實的元素填充著他的鄉村生活。出乎預料的,某一天,張同學突然火了。日均漲粉15萬,到2021年底時,其已經擁有了1500萬粉絲,成了當之無愧的鄉村新頂流。至今也沒有人能說清楚...
(資料圖片)在生活中,很多人都不知道oppo老板段永平是哪里人是什么意思,其實他的意思是非常簡單的,下面就是小編搜索到的oppo老板段永平是哪里人相關的一些知識,我們一起來學習下吧!段永平,男,漢族,江西泰和人,1961年3月生于南昌,1982年浙江大學無線電系畢業后分配到北京 電子管廠 。后攻讀中國 人民大學 經濟系計量 經濟學專業 ,取得碩士學位。曾以創立"小霸王"和"步步高""OPPO"三個...
(資料圖)隨著社會越來越發達,大家都選擇在網絡上汲取相關知識內容,比如微信小秘是個軟件嗎,為了更好的解答大家的問題,小編也是翻閱整理了相應內容,下面就一起來看一下吧!微信小秘現改名為微小秘,是由微秘書工作室自主研發的微信營銷軟件,且是一款高效的移動互聯網營銷工具?;诎沧肯到y的微信群發軟件,其精準、真實、在線互動的模式在國內處于領先位置。擁有完善的銷售管理體系和配套的售后服務網絡,剛上市就受到廣大...