陌兮大魔王帶你深入 學習ArrayList(一)

2021-07-26 17:36:38 字數 2897 閱讀 6707

arraylist的重要性就不言而喻了,在此鄙人就不多說了。本文適合新手閱讀,如果是大神來訪,還望能夠幫忙發現小子知識不足之處,不甚感激。

arraylist是什麼?不就是容器嗎,裝個東西而已!如果你是這樣回答的,那問:它底層到底是什麼?你又如何作答?其實這時候,我們就因該深入其原始碼來學習了。一看到原始碼啊,許多新手肯定都是拒絕的。不外乎兩種原因:1、**看不懂,2、注釋比**更看不懂。所以,鄙人希望,我能給大家獻點薄力,為大家的知識體系添磚蓋瓦。

其實很多原始碼都不難.而arraylist的原始碼同樣如此。現在就讓我們走進arraylist的原始碼世界(篇幅有限,挑一些常用的來說):

進入arraylist的原始碼中,首先看到的是這樣一段**

private transient object elementdata;
private int size;
protected transient int modcount = 0;(來之父類abstractlist,arraylist不存在)
這個elementdata就是用來存放資料的object陣列。size是陣列的大長度,代表的是arraylist的所存貯的資料的容量。modcount用來記錄容器被改變的次數(對理解沒什麼用,後文不再解釋這個變數)。

然後我們看到的是arraylist的構造器

public arraylist(int initialcapacity)
public arraylist()
這段**是初始化arraylist用的。從中我們可以看出,例項arraylist有兩種方法,而我們不一般不帶引數的時候,arraylist預設的大小是10.即產生乙個容量為10的elementdata的object陣列。

下一段**

public void ensurecapacity(int mincapacity) 

}

這一段是為了確保陣列可以存放下不停增多的資料,而專門設計的增加陣列的長度的方法。

從中 可以看出實現思路是:當需要存放資料到elementdata陣列中去的時候,會傳入mincapcity(表示該陣列應存入的總資料量),如果mincapcity大於現在的陣列的長度,就產生乙個新的陣列,容量為以前的1.5倍+1,如果仍然小於,就直接將容量設定為mincapcity。然後再將之前存放在原陣列的資料複製到新的陣列中去,就實現了整個陣列的擴容!

看完前置準備的各種方法之後,可以看操作的方法了:

size():

public int size()
size就是elementdata的長度。

public boolean isempty()
返回size==0的判斷結果

indexof(object o):

public int indexof(object o)  else 

return -1;

}

傳入乙個物件,返回其索引。 可以看出這個方法只是將傳入的物件和elementdata中的每個元素進行比較,然後再返回其陣列下標號。找不到的話,就返回-1。contains(object o)也只是呼叫了這個方法而已。

lastindexof(object o):

public int lastindexof(object o)  else 

return -1;

}

可以看見lastindexof方法和indexof是如此的相似,只是將遍歷方向改變了一下就又多了乙個方法,哈哈!

get(index):

public e get(int index)
private void rangecheck(int index)
set(index,object)

public e set(int index, e element)
可以發現很多操作都只是在運算元組而已!畢竟arraylist就是陣列。

add(o):

public boolean add(e e)
add方法也是如此,只是此處需要判斷是否要擴容

add(index,object):

public void add(int index, e element)
在某個位置插入乙個物件,這段**難得也就這就話:system.arraycopy(elementdata, index, elementdata, index + 1, size - index); 其實這句好的意思是:將elementdata從其第index和後面的元素,複製到elementdata的第index+1和之後的位置,共複製size-index個元素,這樣就是實現了將第index為元素騰空,讓外界傳進來的object佔據這個寶座。這也是前面擴容的時候使用的是size+1而不是size的原因(確保陣列複製時弄的size+1不會越界)

remove(index):

public e remove(int index)
可以發現和add是差不多的,而且還不許要考慮擴容的問題。同樣的remove(object)相比起來,就多了乙個判斷該物件的index在哪,然後直接呼叫這個方法就行了。

看到這裡,想必大家對arraylist也算有乙個清晰地認知了。同時也明白了原始碼並不是很難,而且**原始碼可以很好地加深我們對知識的理解,理解到底層。這樣的學習會讓我們的知識變得更加牢靠!由於今天實在是太晚了,所以沒有貼上自定義實現的myarraylist的**(還沒有寫

如果有什麼問題,還希望能夠一起討論,若是有什麼不足之處,請一定要告訴我,謝謝

大魔王養成日記

這裡是大魔王平時折 騰 的紀實 加得越多,完成進度就慢 廖雪峰git教程 這個教程較為簡單,循序漸進 易百git教程 較為系統 git教程優先選擇廖雪峰git教程 ls rmmkdir chmod catvimvim簡明教程 coolshell 為什麼不用emac?不為什麼,只因我先遇到了vim。g...

彩虹島大魔王 超級回文數

d 超級回文數 description 乙個數字是回文數意味著這個數字正著讀和反著讀相同,比如12321,124421是回文數字,而123,12451不 是。彩虹島的大魔王認為比回文數更加美好的是超級回文數,超級回文數指的是長度為偶數的回文數,比 如124421是回文數,而12321不是。現給定?和...

shell輸出帶顏色的字型 來玩魔王的咚!

securecrt 設定 在命令列中輸出彩色效果的字型。windows的cmd不支援,git bash預設就能使用。而securecrt,預設效果是不開啟的,需要修改回話的設定 預設的設定,效果也能有,但是不支援彩色。勾選ansi彩色選項,就能出彩色的效果,其他的幾個勾可以試下效果,是別的顏色方面的...