一、什么是數(shù)組?什么是鏈表?
(相關(guān)面試題推薦:java面試題)
數(shù)組就像身上編了號(hào)站成一排的人,要找第10個(gè)人很容易,根據(jù)人身上的編號(hào)很快就能找到。但插入、刪除慢,要望某個(gè)位置插入或刪除一個(gè)人時(shí),后面的人身上的編號(hào)都要變。當(dāng)然,加入或刪除的人始終末尾的也快。
鏈表是一種上一個(gè)元素的引用指向下一個(gè)元素的存儲(chǔ)結(jié)構(gòu),鏈表通過指針來連接元素與元素;
鏈表就像手牽著手站成一圈的人,要找第10個(gè)人不容易,必須從第一個(gè)人一個(gè)個(gè)數(shù)過去。但插入、刪除快。插入時(shí)只要解開兩個(gè)人的手,并重新牽上新加進(jìn)來的人的手就可以。刪除一樣的道理。
Java中,ArrayList、LinkedList就是分別用數(shù)組和鏈表做內(nèi)部實(shí)現(xiàn)的。
二、數(shù)組和鏈表有什么區(qū)別
不同:鏈表是鏈?zhǔn)降拇鎯?chǔ)結(jié)構(gòu);數(shù)組是順序的存儲(chǔ)結(jié)構(gòu)。
鏈表通過指針來連接元素與元素,數(shù)組則是把所有元素按次序依次存儲(chǔ)。
(相關(guān)教程推薦:java入門教程)
鏈表的插入刪除元素相對數(shù)組較為簡單,不需要移動(dòng)元素,且較為容易實(shí)現(xiàn)長度擴(kuò)充,但是尋找某個(gè)元素較為困難;
數(shù)組尋找某個(gè)元素較為簡單,但插入與刪除比較復(fù)雜,由于最大長度需要再編程一開始時(shí)指定,故當(dāng)達(dá)到最大長度時(shí),擴(kuò)充長度不如鏈表方便。
相同:兩種結(jié)構(gòu)均可實(shí)現(xiàn)數(shù)據(jù)的順序存儲(chǔ),構(gòu)造出來的模型呈線性結(jié)構(gòu)。
三、java集合和數(shù)組的特點(diǎn)
數(shù)組特點(diǎn):大小固定,只能存儲(chǔ)相同數(shù)據(jù)類型的數(shù)據(jù)
集合特點(diǎn):大小可動(dòng)態(tài)擴(kuò)展,可以存儲(chǔ)各種類型的數(shù)據(jù)
(相關(guān)視頻教程推薦:java視頻教程)
四、LinkedList底層實(shí)現(xiàn)方式
LinkedList是通過雙向鏈表去實(shí)現(xiàn)的,既然是鏈表實(shí)現(xiàn)那么它的隨機(jī)訪問效率比ArrayList要低,順序訪問的效率要比較的高。每個(gè)節(jié)點(diǎn)都有一個(gè)前驅(qū)(之前前面節(jié)點(diǎn)的指針)和一個(gè)后繼(指向后面節(jié)點(diǎn)的指針),效果如下圖:
1、使用for適合循環(huán)ArrayLIst以及數(shù)組,當(dāng)大批量的循環(huán)LinkedList時(shí)程序?qū)?huì)卡死,for適合循環(huán)數(shù)組結(jié)構(gòu),通過下標(biāo)去遍歷。
2、使用foreach適合循環(huán)LinkedList,使用雙鏈表結(jié)構(gòu)實(shí)現(xiàn)的應(yīng)當(dāng)使用foreach循環(huán)。