ArrayList和Arrayst有何不同,你知道嗎?
ArrayList和ArrayList有何不同?大家好,我是磊哥,一位經(jīng)驗(yàn)豐富的程序員。今天我們來(lái)探討一個(gè)常見(jiàn)的面試問(wèn)題——ArrayList和ArrayList有何不同?
首先需要說(shuō)明的是,ArrayList和LinkedList都是Java中l(wèi)ist接口的實(shí)現(xiàn)類。我們可以在代碼中找到這個(gè)接口,并看到其中有多個(gè)實(shí)現(xiàn)類,其中之一是ArrayList。這個(gè)類的中文意思是“數(shù)組列表”,它是一個(gè)數(shù)組,數(shù)組中的元素構(gòu)成了一個(gè)列表。ICOL the list就是列表的意思,好,ok,它們的外觀如何?
可以看下圖,上面是一個(gè)數(shù)組,這些數(shù)組連在一起就形成了一個(gè)ArrayList。下面這個(gè)圖中的節(jié)點(diǎn)通過(guò)指針連接在一起,形成了一個(gè) ArrayList。這就是它們的外觀。
它們有什么不同呢?它們的不同主要體現(xiàn)在以下三個(gè)方面。
·第一點(diǎn)是底層實(shí)現(xiàn)不同。ArrayList是基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn)的,而LinkedList是基于鏈表實(shí)現(xiàn)的。這是它們的不同之處。
·第二點(diǎn)是隨機(jī)訪問(wèn)的性能不同。 ArrayList從下標(biāo)為零開(kāi)始,下標(biāo)為一,下標(biāo)為二。當(dāng)訪問(wèn)下標(biāo)為二的元素時(shí),可以直接取到下標(biāo)為三的元素,因此它的時(shí)間復(fù)雜度是L1。而ArrayLiL則不同。它在進(jìn)行隨機(jī)訪問(wèn)時(shí)只能從根節(jié)點(diǎn)開(kāi)始,因此時(shí)間復(fù)雜度為O(n)。因此,在隨機(jī)訪問(wèn)方面,ArrayLiL的性能不如ArrayList。
·第三點(diǎn)不同是它們的插入和刪除性能不同。由于ArrayLiL是動(dòng)態(tài)數(shù)組,當(dāng)刪除下標(biāo)為零的元素時(shí),后面的元素需要向前移動(dòng),因?yàn)槔洗蟛辉诹耍隙胬洗蟮奈恢?,老三代替老二的位置,后面所有的元素都需要向前移?dòng)。因此,除了添加和刪除的性能之外,插入和刪除的性能也一樣。
如果添加元素時(shí)添加到了第一個(gè)位置,那么其他位置的元素也需要向后移動(dòng),原來(lái)的第一個(gè)位置也需要向后移動(dòng)。因此,對(duì)于添加和刪除操作,ArrayLiL的性能也不如ArrayList。
released的速度相對(duì)較慢,但對(duì)于linkthelist來(lái)說(shuō)則不是如此。如果要?jiǎng)h除頭結(jié)點(diǎn),只需將其刪除即可。這樣,后面的所有節(jié)點(diǎn)都不會(huì)受到影響,因?yàn)樗鼈兊奈恢煤椭羔樁疾粫?huì)發(fā)生變化,只是頭節(jié)點(diǎn)不見(jiàn)了而已。如果第二個(gè)節(jié)點(diǎn)不見(jiàn)了,也只需要將其刪除,然后將第一個(gè)節(jié)點(diǎn)的下一個(gè)指針指向原來(lái)的第三個(gè)位置即可。這樣做的過(guò)程中,只需要修改一個(gè)位置。
而對(duì)于released來(lái)說(shuō),則需要將后面的所有元素都向前移動(dòng),因此在插入和刪除操作上,lincolnlist的性能要優(yōu)于released。這是它們?nèi)咧g的主要區(qū)別。可以將它們視為平分秋色的兩種實(shí)現(xiàn)方式,一個(gè)是數(shù)組,一個(gè)是列表。在隨機(jī)訪問(wèn)方面,connect更加高效。在刪除和添加操作方面,connect和the list的性能都更好,因此兩者可以打平。
這篇文章介紹了基本的語(yǔ)法和使用方法,讀者可以通過(guò)添加方法來(lái)創(chuàng)建released,并通過(guò)at方法進(jìn)行添加。當(dāng)然,也可以使用泛型,以確保添加的元素只能是And。發(fā)布的使用方式與發(fā)布非常相似,也是一種泛型結(jié)構(gòu)。
發(fā)型的定義方式仍然是通過(guò)某種方法進(jìn)行添加的,最后進(jìn)行打印。為什么?因?yàn)樗鼈兊姆椒ǚ浅O嗨疲褂枚冗_(dá)到了90%。它們都來(lái)自于list的基礎(chǔ)行為,比如添加,就是通過(guò)at實(shí)現(xiàn)的。只是在發(fā)布和林肯發(fā)布下面有不同的實(shí)現(xiàn)方式。這就是它們兩個(gè)技術(shù)的使用方式。
簡(jiǎn)單總結(jié)一下,對(duì)于發(fā)布和林肯發(fā)布來(lái)說(shuō),它們都是list下面的兩個(gè)實(shí)線類,但有三點(diǎn)不同。底層的實(shí)線數(shù)據(jù)結(jié)構(gòu)不同,隨機(jī)訪問(wèn)的性能不同,以及插入和刪除的性能不同。在隨機(jī)訪問(wèn)較多、詢問(wèn)較多的場(chǎng)景下,可以選擇使用發(fā)布。如果在添加和刪除頻率較高的場(chǎng)景下,可以選擇使用林肯發(fā)布,今天的內(nèi)容到此結(jié)束。記得一鍵私聯(lián),下期再見(jiàn),拜拜。