ArrayList是基于Object數(shù)組實(shí)現(xiàn)的,我們可以通過下標(biāo)來實(shí)現(xiàn)對元素的取,即可以實(shí)現(xiàn)隨機(jī)訪問,但是在插入的時(shí)候,需要移動(dòng)大量元素,所以對于能夠隨機(jī)訪問,而不經(jīng)常進(jìn)行增刪的需求,我們盡量使用ArrayList。而linkedList是基于鏈表實(shí)現(xiàn)的,那么在進(jìn)行增刪的時(shí)候,只需要修改相應(yīng)的指針,就可以實(shí)現(xiàn)元素的增刪,效率非常高,所以對于需要快速增刪元素,應(yīng)該選擇linkedList。
我們不僅要好奇,為什么linkedList的插入效率這么高呢?下面我們通過源碼來一探究竟。
從中,我們可以看出:通過add(int index,E element)向linkedList插入元素時(shí)。先是在雙向鏈表中找到要插入節(jié)點(diǎn)的位置index;找到之后,再插入一個(gè)新節(jié)點(diǎn)。
雙向鏈表查找index位置的節(jié)點(diǎn)時(shí),有一個(gè)加速動(dòng)作:若index<雙向鏈表長度的1/2,則從前向后查找;否則,從后向前查找。所以linkedList的插入效率非常高,與之形成對比的,就是ArrayList的插入了。
從上面的方法可以看出,在進(jìn)行插入之前,首先會(huì)調(diào)用ensureCapacity()方法,來保證ArrayList的容量,如果容量不足,首先要進(jìn)行擴(kuò)容,然后真正費(fèi)時(shí)的就是這句:
System.arraycopy(elementData,index,elementData,index+1,size-index)
這句話表明,在插入的時(shí)候,會(huì)移動(dòng)index后面的所有元素,這就是ArrayList插入元素效率低的原因。
下面我們來分析一下ArrayList和linkedList隨機(jī)訪問的效率。
首先來看linkedList的隨機(jī)訪問:
對于linkedList來說,隨機(jī)訪問第index的元素,從頭結(jié)點(diǎn)開始遍歷,查找到index的位置,然后返回元素,這里只不過有一個(gè)加速遍歷的動(dòng)作而已。
但是對于ArrayList來說就不同了:
從中,我們可以看出:通過get(int index)獲取ArrayList第index個(gè)元素時(shí)。直接返回?cái)?shù)組中index位置的元素,而不需要像linkedList一樣進(jìn)行查找。
以上就是深圳達(dá)內(nèi)教育java培訓(xùn)機(jī)構(gòu)的小編針對“Java中l(wèi)ist的使用之List的應(yīng)用場景”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。