“簡(jiǎn)單不先于復(fù)雜,而是在復(fù)雜之后.” —— Alan Perlis
首行推薦——http://www.reibang.com/p/ba0fdee47cb4
ArrayList和LinkedList都是實(shí)現(xiàn)了List接口的類,他們都是元素的容器,用于存放對(duì)象的引用渔隶;
他們都可以對(duì)存放的元素進(jìn)行增刪改查的操作,還可以進(jìn)行排序。
但是垦梆,他們還是有區(qū)別的。
除了實(shí)現(xiàn)對(duì)List接口的實(shí)現(xiàn)仅孩,他們還實(shí)現(xiàn)了其他的接口托猩,由此造就了他們之間的差異;
ArrayList
ArrayList:內(nèi)部使用數(shù)組的形式實(shí)現(xiàn)了存儲(chǔ)杠氢,實(shí)現(xiàn)了RandomAccess接口站刑,利用數(shù)組的下面進(jìn)行元素的訪問(wèn),因此對(duì)元素的隨機(jī)訪問(wèn)速度非潮前伲快绞旅。
因?yàn)槭菙?shù)組,所以ArrayList在初始化的時(shí)候温艇,有初始大小10因悲,插入新元素的時(shí)候,會(huì)判斷是否需要擴(kuò)容勺爱,擴(kuò)容的步長(zhǎng)是0.5倍原容量晃琳,擴(kuò)容方式是利用數(shù)組的復(fù)制,因此有一定的開(kāi)銷琐鲁;
另外卫旱,ArrayList在進(jìn)行元素插入的時(shí)候,需要移動(dòng)插入位置之后的所有元素围段,位置越靠前顾翼,需要位移的元素越多,開(kāi)銷越大奈泪,相反适贸,插入位置越靠后的話灸芳,開(kāi)銷就越小了,如果在最后面進(jìn)行插入拜姿,那就不需要進(jìn)行位移烙样;
LinkedList
LinkedList:內(nèi)部使用雙向鏈表的結(jié)構(gòu)實(shí)現(xiàn)存儲(chǔ),LinkedList有一個(gè)內(nèi)部類作為存放元素的單元蕊肥,里面有三個(gè)屬性谒获,用來(lái)存放元素本身以及前后2個(gè)單元的引用,另外LinkedList內(nèi)部還有一個(gè)header屬性晴埂,用來(lái)標(biāo)識(shí)起始位置究反,LinkedList的第一個(gè)單元和最后一個(gè)單元都會(huì)指向header,因此形成了一個(gè)雙向的鏈表結(jié)構(gòu)儒洛。
LinkedList是采用雙向鏈表實(shí)現(xiàn)的精耐。所以它也具有鏈表的特點(diǎn),每一個(gè)元素(結(jié)點(diǎn))的地址不連續(xù)琅锻,通過(guò)引用找到當(dāng)前結(jié)點(diǎn)的上一個(gè)結(jié)點(diǎn)和下一個(gè)結(jié)點(diǎn)卦停,即插入和刪除效率較高,只需要常數(shù)時(shí)間恼蓬,而get和set則較為低效惊完。
LinkedList的方法和使用和ArrayList大致相同,由于LinkedList是鏈表實(shí)現(xiàn)的处硬,所以額外提供了在頭部和尾部添加/刪除元素的方法小槐,也沒(méi)有ArrayList擴(kuò)容的問(wèn)題了。另外荷辕,ArrayList和LinkedList都可以實(shí)現(xiàn)棧凿跳、隊(duì)列等數(shù)據(jù)結(jié)構(gòu),但LinkedList本身實(shí)現(xiàn)了隊(duì)列的接口疮方,所以更推薦用LinkedList來(lái)實(shí)現(xiàn)隊(duì)列和棧控嗜。
綜上所述,在需要頻繁讀取集合中的元素時(shí)骡显,使用ArrayList效率較高疆栏,而在插入和刪除操作較多時(shí),使用LinkedList效率較高惫谤。