中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現LinkedList源碼解析

發布時間:2021-12-23 16:43:22 來源:億速云 閱讀:303 作者:柒染 欄目:大數據

這期內容當中小編將會給大家帶來有關如何實現LinkedList源碼解析,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

我們主要介紹LinkedList集合類。它和ArrayList不同的是,LinkedList底層是通過雙向鏈表的方式實現的。下面我們介紹一下雙向鏈表的知識。ArrayList底層數組在處理業務有一個很大的性能問題,就是如果我們從數組的中間位置要刪除一個元素要付出很大的代價,原因就是將元素刪除之后,這個元素后面的元素都要向數組的前端移動,所以會造成性能的損失,同樣,在數組的中間位置插入元素時,也會有上述等問題。于是Java的設計者們為了解決ArrayList的性能問題時,于是LinkedList誕生了。因為它底層是采用雙向鏈表的方式實現的,所以不會出現上述等問題。下面我們詳細了解一下鏈表這個數據結構。

數組的底層實現是在連續的內存上存儲的對象的信息,而在鏈表中卻不是這樣的,它會將每一個對象都存儲在不同的獨立的節點中,并且每個節點中除了存儲要保存的數據信息外,還將存儲上一個節點的引用和下一個節點的引用信息。在Java中可以將它們叫做前驅節點和后繼節點。如下圖所示:

如何實現LinkedList源碼解析

所以在我們使用LinkedList集合類時,從LinkedList刪除一個元素是很方便的,并且性能是非常高的,因為它只需要把相應節點中的前驅節點和后繼節點的引用刪除就可以了,而不需要執行其它的額外操作。如下圖所示:

如何實現LinkedList源碼解析

所以,通過上面雙向鏈表數據結構的特性,使我們知道在使用LinkedList集合類時,如果有頻繁的插入和刪除操作時,那么使用LinkedList集合類時效率會比較高。但LinkedList集合的檢索速度與ArrayList集合相比性能卻要低很多,原因就是雙鏈表的存儲方式并不一定是連續的內存,所以在檢索時,必須從雙鏈表的第一個節點一個一個的向后查找,所以會消耗大量的查詢時間,降低程序的運行性能。下面我們來分析一下LinkedList集合類的源碼來看看底層是怎么實現上述功能的。

如何實現LinkedList源碼解析

LinkedList的構造方法,這里只是定義了一個空的構造方法,并沒有其它的邏輯實現。可能有人想說,那我們完全可以不定義這個空的構造方法啊,反正虛擬機也會為我們自動創建,那為什么還要定義一個空的呢?虛擬機的確會為類自動創建一個空的構造方法,但這里有一個條件,那就是當前類中不能有其它的構造方法。如果虛擬機發現在當前類中已經有了其它的構造方法時,那么虛擬機在執行時是不會為我們自動創建新的構造方法的。在LinkedList中其實已經有了很多有參的構造方法,所以創建上述無參的構造方法,只是為了方便我們創建無參的LinkedList對象, 方便我們實例化用的。

如何實現LinkedList源碼解析

LinkedList中的添加方法,方法比較簡單主要就是調用了linkLast()方法,可見該方法就是實現整個add()方法邏輯的主要方法。下面我們看一下該方法的源碼。

如何實現LinkedList源碼解析

我們看到此方法中使用了一個Node這個類,那我們先看看這個類的定義。

如何實現LinkedList源碼解析


現在我們知道了這個Node類是LinkedList集合中的一個內部類,它的功就相當于雙鏈表中的節點,所以這個類中除了保存了當前元素外,還保存了這個元素的前驅節點,和后繼節點。所以在linkLast()方法的前兩句代碼的意思就是將當前節點保存到一個新的節點中,然后在將鏈表中的最后一個元素設置為當前元素的前驅節點,然后在將當前元素的后繼節點設置為null。這樣就把數據添加到了當前節點中。所以LinkedList集合中的add()方法,每次都會把元素添加到鏈表的后端,這也是保證在LinkedList集合存儲元素順序的根本原因。將后繼節點設置為null的目的是在雙鏈表中此節點為最后一個節點。

通過上述的分析使我們知道LinkedList集合和ArrayList集合一樣,也不是線程安全的,所以在多線程開發時也要額外添加同步代碼,保證集合的線程安全。

上述就是小編為大家分享的如何實現LinkedList源碼解析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

屯门区| 中阳县| 迁西县| 玉龙| 深泽县| 航空| 钦州市| 和林格尔县| 滦南县| 天全县| 专栏| 西充县| 金山区| 和硕县| 怀宁县| 岳普湖县| 永丰县| 平南县| 波密县| 固原市| 平山县| 黑龙江省| 安阳市| 扬州市| 文登市| 福州市| 定南县| 和林格尔县| 安徽省| 育儿| 大理市| 小金县| 于都县| 青海省| 新宁县| 宿松县| 壤塘县| 页游| 闽侯县| 大足县| 乌兰察布市|