java 判断是否是list_JAVA从头开始一基础梳理(4-3)
大家好,今天我們介紹一下java中常用的集合類型。
首先,我們先看一下java中集合類型的結(jié)構(gòu)。
以上是集合的繼承關(guān)系圖,通常我們使用的比較多的是 Set , List , Map以及其衍生的子類和接口實現(xiàn)類。
首先給大家介紹一下List,List本身是一個接口類,它向它的實現(xiàn)類定義了一系列的接口函數(shù)。
在List類后跟了一個標記,表示對于List來說,是可以指定類型的,比如List,代表list保存的數(shù)據(jù)類型為String字符串,又比如List,代表list保存的數(shù)據(jù)類型為封裝int
他代表的是有序的,可重復(fù)的一個集合體,為了研究他的具體邏輯,我們從ArrayList的源碼開始對應(yīng)List接口所規(guī)范的接口函數(shù)。
1.add(E e);
add函數(shù)提供了向ArrayList對象添加一個數(shù)據(jù)的功能,具體源碼如下
可以看到ArrayList類實現(xiàn)了List接口中的add函數(shù),我們來看看他是如何做的。
首先源碼462行中,調(diào)用了函數(shù)ensureCapacityInternal,這個函數(shù)的主要作用是用于判斷當前集合內(nèi)保存數(shù)據(jù)的數(shù)組(what?)的長度是否滿足繼續(xù)添加,如果不滿足的話就需要進行擴容,具體實現(xiàn)代碼如下
我們發(fā)現(xiàn),ArrayList對象做add操作時似乎是將數(shù)據(jù)保存在了數(shù)組中,向上翻閱源碼
原來ArrayList對象對于數(shù)據(jù)的保存是確實是放在了數(shù)組里,那么從這里我們至少可以了解到,對于ArrayList來說,最多保存的數(shù)據(jù)量也就是int數(shù)字的最大值。而由于保存的內(nèi)容是放在數(shù)組里的,于是,對于ArrayList,保存的數(shù)據(jù)是有順序性的(數(shù)組用標識來表示順序)。
接著看源碼的463行,add函數(shù)將傳入的參數(shù)加入到了數(shù)組中,放入的位置是size++。那么size又代表什么呢,我們繼續(xù)查看源碼
上面的注釋已經(jīng)很明確的告訴我們,size代表的是當前的arraylist對象的長度,由于int類型的默認值為0,所以,當我們第一次調(diào)用add函數(shù),執(zhí)行的代碼實際上是
elementData[0] = e;
由于執(zhí)行了size++,所以,當這一次add操作完成時,size的值由0 增長 為了1,那么下一次再執(zhí)行add操作時,傳入的參數(shù)就放到了數(shù)組的標識1的位置。
2.size();
根據(jù)上面的分析,我們很容易就可以知道,這個函數(shù)得到的結(jié)果是當前ArrayList對象中數(shù)據(jù)數(shù)組所保存的數(shù)據(jù)數(shù)量(不是數(shù)組長度)
了解了這些內(nèi)容,那么其他的函數(shù)就比較好理解了。
3.isEmpty()
判斷當前對象的數(shù)據(jù)量是否是0
4.indexOf(Object o)
通過正向遍歷,獲得指定值第一次出現(xiàn)的標識值
5.lastIndexOf(Object o)
通過逆向遍歷,獲得指定值最后一次出現(xiàn)的標識值
6.contains(Object o)
調(diào)用indexof函數(shù)確定指定的值時否存在于當前數(shù)組中
7.get(int index)
rangeCheck函數(shù)用于確定傳入的標識是在數(shù)組的允許標識范圍內(nèi),如果沒有滿足,則會拋出異常,對于異常,在后續(xù)章節(jié)會為大家介紹。接著,調(diào)用elementData函數(shù)返回數(shù)組中指定標識的數(shù)據(jù)
8.remove(int index) / remove(Object o)
remove函數(shù)刪除指定標識的數(shù)據(jù)/remove函數(shù)刪除指定內(nèi)容的數(shù)據(jù)
remove函數(shù)稍微復(fù)雜一些,首先驗證了標識的正確性,接著將指定標識位置的數(shù)據(jù)暫存在oldValue變量中,接著通過系統(tǒng)提供的arraycopy函數(shù)將當前數(shù)組中從標識的位置開始,一直都尾部的數(shù)據(jù)進行重新覆蓋,接著,size自減,并將數(shù)組的最后一位設(shè)置為null。
上圖為各位演示ArrayList的使用示例
運行結(jié)果為
ps:對于源碼中的一些函數(shù)如果不能理解,可以嘗試自己去找找資料,或者給 進擊留言,有時間的時候會給大家回復(fù)的哈。
通過add和remove函數(shù),我們了解到,ArrayList本身實現(xiàn)基于數(shù)組,而又由于數(shù)組本身的特性(定義長度后不可更改長度,只能重新聲明),ArrayList在增加,刪除時,系統(tǒng)資源開銷會比較大,所以,如果在以后有需要頻繁的增刪操作的集合結(jié)構(gòu),應(yīng)該盡量避免使用ArrayList。
以上就是ArrayList類中一些常用的函數(shù),除了這些之外,還有很多沒有介紹到的函數(shù),大家可以自己去了解一下。
總結(jié)
以上是生活随笔為你收集整理的java 判断是否是list_JAVA从头开始一基础梳理(4-3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑卡顿不流畅是什么原因_什么造成游戏直
- 下一篇: html语言闪烁特效代码,css3 文字