這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)如何實(shí)現(xiàn)LinkedList源碼解析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站頁面設(shè)計(jì)、網(wǎng)站優(yōu)化SEO優(yōu)化為一體的專業(yè)的建站公司,已為成都等多地近百家企業(yè)提供網(wǎng)站建設(shè)服務(wù)。追求良好的瀏覽體驗(yàn),以探求精品塑造與理念升華,設(shè)計(jì)最適合用戶的網(wǎng)站頁面。 合作只是第一步,服務(wù)才是根本,我們始終堅(jiān)持講誠信,負(fù)責(zé)任的原則,為您進(jìn)行細(xì)心、貼心、認(rèn)真的服務(wù),與眾多客戶在蓬勃發(fā)展的市場環(huán)境中,互促共生。
我們主要介紹LinkedList集合類。它和ArrayList不同的是,LinkedList底層是通過雙向鏈表的方式實(shí)現(xiàn)的。下面我們介紹一下雙向鏈表的知識(shí)。ArrayList底層數(shù)組在處理業(yè)務(wù)有一個(gè)很大的性能問題,就是如果我們從數(shù)組的中間位置要?jiǎng)h除一個(gè)元素要付出很大的代價(jià),原因就是將元素刪除之后,這個(gè)元素后面的元素都要向數(shù)組的前端移動(dòng),所以會(huì)造成性能的損失,同樣,在數(shù)組的中間位置插入元素時(shí),也會(huì)有上述等問題。于是Java的設(shè)計(jì)者們?yōu)榱私鉀QArrayList的性能問題時(shí),于是LinkedList誕生了。因?yàn)樗讓邮遣捎秒p向鏈表的方式實(shí)現(xiàn)的,所以不會(huì)出現(xiàn)上述等問題。下面我們?cè)敿?xì)了解一下鏈表這個(gè)數(shù)據(jù)結(jié)構(gòu)。
數(shù)組的底層實(shí)現(xiàn)是在連續(xù)的內(nèi)存上存儲(chǔ)的對(duì)象的信息,而在鏈表中卻不是這樣的,它會(huì)將每一個(gè)對(duì)象都存儲(chǔ)在不同的獨(dú)立的節(jié)點(diǎn)中,并且每個(gè)節(jié)點(diǎn)中除了存儲(chǔ)要保存的數(shù)據(jù)信息外,還將存儲(chǔ)上一個(gè)節(jié)點(diǎn)的引用和下一個(gè)節(jié)點(diǎn)的引用信息。在Java中可以將它們叫做前驅(qū)節(jié)點(diǎn)和后繼節(jié)點(diǎn)。如下圖所示:
所以在我們使用LinkedList集合類時(shí),從LinkedList刪除一個(gè)元素是很方便的,并且性能是非常高的,因?yàn)樗恍枰严鄳?yīng)節(jié)點(diǎn)中的前驅(qū)節(jié)點(diǎn)和后繼節(jié)點(diǎn)的引用刪除就可以了,而不需要執(zhí)行其它的額外操作。如下圖所示:
所以,通過上面雙向鏈表數(shù)據(jù)結(jié)構(gòu)的特性,使我們知道在使用LinkedList集合類時(shí),如果有頻繁的插入和刪除操作時(shí),那么使用LinkedList集合類時(shí)效率會(huì)比較高。但LinkedList集合的檢索速度與ArrayList集合相比性能卻要低很多,原因就是雙鏈表的存儲(chǔ)方式并不一定是連續(xù)的內(nèi)存,所以在檢索時(shí),必須從雙鏈表的第一個(gè)節(jié)點(diǎn)一個(gè)一個(gè)的向后查找,所以會(huì)消耗大量的查詢時(shí)間,降低程序的運(yùn)行性能。下面我們來分析一下LinkedList集合類的源碼來看看底層是怎么實(shí)現(xiàn)上述功能的。
LinkedList的構(gòu)造方法,這里只是定義了一個(gè)空的構(gòu)造方法,并沒有其它的邏輯實(shí)現(xiàn)。可能有人想說,那我們完全可以不定義這個(gè)空的構(gòu)造方法啊,反正虛擬機(jī)也會(huì)為我們自動(dòng)創(chuàng)建,那為什么還要定義一個(gè)空的呢?虛擬機(jī)的確會(huì)為類自動(dòng)創(chuàng)建一個(gè)空的構(gòu)造方法,但這里有一個(gè)條件,那就是當(dāng)前類中不能有其它的構(gòu)造方法。如果虛擬機(jī)發(fā)現(xiàn)在當(dāng)前類中已經(jīng)有了其它的構(gòu)造方法時(shí),那么虛擬機(jī)在執(zhí)行時(shí)是不會(huì)為我們自動(dòng)創(chuàng)建新的構(gòu)造方法的。在LinkedList中其實(shí)已經(jīng)有了很多有參的構(gòu)造方法,所以創(chuàng)建上述無參的構(gòu)造方法,只是為了方便我們創(chuàng)建無參的LinkedList對(duì)象, 方便我們實(shí)例化用的。
LinkedList中的添加方法,方法比較簡單主要就是調(diào)用了linkLast()方法,可見該方法就是實(shí)現(xiàn)整個(gè)add()方法邏輯的主要方法。下面我們看一下該方法的源碼。
我們看到此方法中使用了一個(gè)Node這個(gè)類,那我們先看看這個(gè)類的定義。
現(xiàn)在我們知道了這個(gè)Node類是LinkedList集合中的一個(gè)內(nèi)部類,它的功就相當(dāng)于雙鏈表中的節(jié)點(diǎn),所以這個(gè)類中除了保存了當(dāng)前元素外,還保存了這個(gè)元素的前驅(qū)節(jié)點(diǎn),和后繼節(jié)點(diǎn)。所以在linkLast()方法的前兩句代碼的意思就是將當(dāng)前節(jié)點(diǎn)保存到一個(gè)新的節(jié)點(diǎn)中,然后在將鏈表中的最后一個(gè)元素設(shè)置為當(dāng)前元素的前驅(qū)節(jié)點(diǎn),然后在將當(dāng)前元素的后繼節(jié)點(diǎn)設(shè)置為null。這樣就把數(shù)據(jù)添加到了當(dāng)前節(jié)點(diǎn)中。所以LinkedList集合中的add()方法,每次都會(huì)把元素添加到鏈表的后端,這也是保證在LinkedList集合存儲(chǔ)元素順序的根本原因。將后繼節(jié)點(diǎn)設(shè)置為null的目的是在雙鏈表中此節(jié)點(diǎn)為最后一個(gè)節(jié)點(diǎn)。
通過上述的分析使我們知道LinkedList集合和ArrayList集合一樣,也不是線程安全的,所以在多線程開發(fā)時(shí)也要額外添加同步代碼,保證集合的線程安全。
上述就是小編為大家分享的如何實(shí)現(xiàn)LinkedList源碼解析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。