Java資料結構之線性表-Java那些事兒專欄

清淺池塘發表於2018-02-02

這篇文章我們來說說Java裡一個很重要的資料結構——線性表,還是這張圖,線性表對應著下圖裡的List。

Java資料結構之線性表-Java那些事兒專欄

紅框裡的內容就是線性表的大家族了,其中黃色部分是要重點了解的,線性表裡的元素是按線性排列的(這裡的線性指邏輯上的) 線性表分為兩大類,分別是順序表和連結串列

一、順序表

順序表中的資料元素儲存是連續的,記憶體劃分的區域也是連續的。儲存結構如下圖:

Java資料結構之線性表-Java那些事兒專欄

我們的ArrayList底層是陣列實現的,底層元素在記憶體中是按順序排列的,ArrayList是Java中順序表的體現。


二、連結串列

連結串列在物理儲存上通常是非連續、非順序的方式儲存的,資料元素的邏輯順序是通過連結串列中的引用來實現的。

1、單向連結串列

很簡單,記憶體中的物件是隨機分佈的,物件不但儲存了張三、李四等資料,還持有一個next引用,指向下一個物件,來確定一組物件的邏輯順序。

Java資料結構之線性表-Java那些事兒專欄

2、迴圈連結串列

也很簡單,和單向連結串列一樣,只不過最後一個物件的next又指向了第一個物件。

Java資料結構之線性表-Java那些事兒專欄

3、雙向連結串列

不但持有next引用,指向下一個物件,還持有一個prev引用,指向上一個物件。

Java資料結構之線性表-Java那些事兒專欄

記住雙向連結串列這個圖,很重要,下一篇文章我們要講的LinkedList就是以雙向連結串列的方式實現的。


三、棧和佇列

棧和佇列是兩種比較特殊的線性表。

1、

棧是一種操作受限制的線性表。其限制是僅允許線上性表的尾部進行新增和刪除操作,這一端被稱為棧頂,另一端稱為棧底。向一個棧新增新元素叫壓棧,刪除元素又稱為出棧

Java資料結構之線性表-Java那些事兒專欄

如上圖,把趙六放入到棧中叫壓棧,不放入趙六,直接取出(刪除)王五的過程叫出棧,只能從棧頂放入和刪除元素。本文第一張圖裡的Stack就是棧在Java中的實現。舉個例子,最後洗好的盤子都是疊放在最上面的,但每次用的時候都是從最上面拿,最先洗好的盤子反而不容易用到。


2、佇列

佇列也是一種操作受限制的線性表。只能從頭部刪除(取出)元素,從隊尾新增元素,進行刪除操作的端稱為隊頭。

Java資料結構之線性表-Java那些事兒專欄

看上面的圖,只能從隊尾新增元素,隊頭取出(刪除)元素。本文第一張圖裡的Queue就是佇列的體現,Queue是基於連結串列來體現的。注意,Queue是一個介面,直接寫如下程式碼是會報錯的

Queue queue = new Queue();//會報錯,Queue是介面,不允許例項化
複製程式碼

正確的用法是

Queue queue = new LinkedList();//  正確的用法,基於連結串列來實現
複製程式碼

佇列的連結串列實現是通過子類LinkedList來實現的,Queue介面收窄了LinkedList的訪問許可權,只提供從隊尾,隊頭等的操作。

為了加深大家的印象,我舉一個例子,噁心了一點,但保證大家能記住,大家在喝啤酒的過程中,正常去廁所小解的,這個過程叫做隊例。喝多了吐出來的過程,叫做棧


以上就是Java線性表的介紹,面試中會經常被問起,後續文章會把重點都說一下,希望對大家能有所幫助。


上一篇:Arraylist與Vector的區別 - Java那些事兒專欄

下一篇:待續

注:本專欄文章首發於公眾號:saysayJava。所有示例程式碼均已上傳至公眾號,需要請關注下載。

如果喜歡本系列文章,請為我點贊或順手分享,您的支援是我繼續下去的動力,您也可以在評論區留言想了解的內容,有機會本專欄會做講解,最後別忘了關注一下我。

轉載無限歡迎,但請註明「作者」和「原文地址」。轉載請在文中保留此段,感謝您對作者版權的尊重。如需商業轉載或刊登,請聯絡作者獲得授權


相關文章