1.LinkedList的底層如何實(shí)現(xiàn)的丐吓。
LinkedList底層數(shù)據(jù)結(jié)構(gòu)是采用雙端鏈表【一個(gè)指向第一個(gè)節(jié)點(diǎn)的指針恋昼,一個(gè)指向最后一個(gè)節(jié)點(diǎn)的指針】
2.LinkedList的使用場(chǎng)景。
對(duì)于頻繁進(jìn)行插入和刪除的情況使用LinkedList 的效率相對(duì)于ArrayList 更高
ArrayList和LinkedList的get()垦梆;
ArrayList里面的數(shù)據(jù)就好像 排好隊(duì)的學(xué)生奈虾,已經(jīng)為每一個(gè)學(xué)生編號(hào)[從0-n],當(dāng)老師叫多少號(hào)時(shí)菜职,該編號(hào)的學(xué)生就直接出列了青抛;
LinkedList使用的雙向鏈表來(lái)保存數(shù)據(jù)的,每一個(gè)結(jié)點(diǎn)只保存了下一個(gè)結(jié)點(diǎn)和上一個(gè)結(jié)點(diǎn)的地址酬核,沒(méi)有任何編號(hào)蜜另,當(dāng)老師想叫某名學(xué)生[傳遞給LinkedList的是一個(gè)int位置]出列時(shí),LinekdList獲取該位置時(shí)首先和整個(gè)LinkedList的size/2? 做比較嫡意,前半部分做順序遍歷蚕钦,后半部分做逆序遍歷;但每次遍歷都得從第一個(gè)元素或者最后一個(gè)元素開(kāi)始遍歷鹅很,即LinkedList get任意位置的元素時(shí)嘶居,都會(huì)把前面的數(shù)據(jù)給遍歷一遍【這就是使用for 循環(huán)遍歷LinkedList[數(shù)據(jù)量比較大時(shí),>10w時(shí)]比較慢的原因】
3.LinkedList? 增促煮、刪邮屁、查 的源碼
LinkedList add 源碼[JDK1.7.0_79]
LinkedList 調(diào)用 add() 方法時(shí),默認(rèn)是添加到鏈表的尾部菠齿;也有從鏈表頭部進(jìn)行添加的方法佑吝,addFirst()
LinkedList remove? 源碼
LinkedList get 源碼
? ? ? ? LinkedList 在進(jìn)行g(shù)et 獲取指定位置的元素時(shí),采用折半查找的算法绳匀,首先判斷指定位置在一半之前還是一半之后芋忿,然后再進(jìn)行循環(huán)遍歷,獲取指定位置的元素疾棵,將其返回戈钢。