這篇文章我們來說說Java裡一個很重要的資料結構——線性表,還是這張圖,線性表對應著下圖裡的List。
![Java資料結構之線性表-Java那些事兒專欄](https://i.iter01.com/images/75ea7cdf63073765498a264a1532e29de829f074ce4e381f6613ce625ffec135.jpg)
紅框裡的內容就是線性表的大家族了,其中黃色部分是要重點了解的,線性表裡的元素是按線性排列的(這裡的線性指邏輯上的) 線性表分為兩大類,分別是順序表和連結串列:
一、順序表
順序表中的資料元素儲存是連續的,記憶體劃分的區域也是連續的。儲存結構如下圖:
![Java資料結構之線性表-Java那些事兒專欄](https://i.iter01.com/images/5d8ec480469deba8db141d113d7283a0354ee99076443b9149333de12ce515be.jpg)
我們的ArrayList底層是陣列實現的,底層元素在記憶體中是按順序排列的,ArrayList是Java中順序表的體現。
二、連結串列
連結串列在物理儲存上通常是非連續、非順序的方式儲存的,資料元素的邏輯順序是通過連結串列中的引用來實現的。
1、單向連結串列
很簡單,記憶體中的物件是隨機分佈的,物件不但儲存了張三、李四等資料,還持有一個next引用,指向下一個物件,來確定一組物件的邏輯順序。
![Java資料結構之線性表-Java那些事兒專欄](https://i.iter01.com/images/fbe0426938656ac258f977fd51b5bf6a45e44aa30ff42c0d5c925d3ff60403a1.jpg)
2、迴圈連結串列
也很簡單,和單向連結串列一樣,只不過最後一個物件的next又指向了第一個物件。
![Java資料結構之線性表-Java那些事兒專欄](https://i.iter01.com/images/8b1ba3418b51dd8ab92db273313ce240f4cf7c966a6f9cffbc25a441d1aa2aac.jpg)
3、雙向連結串列
不但持有next引用,指向下一個物件,還持有一個prev引用,指向上一個物件。
![Java資料結構之線性表-Java那些事兒專欄](https://i.iter01.com/images/3a100f06d016d0ed7d7e34522a42abd2da783c7c447e889c330f9ed17bcfec93.jpg)
記住雙向連結串列這個圖,很重要,下一篇文章我們要講的LinkedList就是以雙向連結串列的方式實現的。
三、棧和佇列
棧和佇列是兩種比較特殊的線性表。
1、棧
棧是一種操作受限制的線性表。其限制是僅允許線上性表的尾部進行新增和刪除操作,這一端被稱為棧頂,另一端稱為棧底。向一個棧新增新元素叫壓棧,刪除元素又稱為出棧。
![Java資料結構之線性表-Java那些事兒專欄](https://i.iter01.com/images/012386cb239d6c14785858552dd4eff9895b586af4646f489c9c3cba7e999116.jpg)
如上圖,把趙六放入到棧中叫壓棧,不放入趙六,直接取出(刪除)王五的過程叫出棧,只能從棧頂放入和刪除元素。本文第一張圖裡的Stack就是棧在Java中的實現。舉個例子,最後洗好的盤子都是疊放在最上面的,但每次用的時候都是從最上面拿,最先洗好的盤子反而不容易用到。
2、佇列
佇列也是一種操作受限制的線性表。只能從頭部刪除(取出)元素,從隊尾新增元素,進行刪除操作的端稱為隊頭。
![Java資料結構之線性表-Java那些事兒專欄](https://i.iter01.com/images/47e2bcb2fd03e985091acad3288f078f0a316f1219403a9f8e70ecfea6a6d2ab.jpg)
看上面的圖,只能從隊尾新增元素,隊頭取出(刪除)元素。本文第一張圖裡的Queue就是佇列的體現,Queue是基於連結串列來體現的。注意,Queue是一個介面,直接寫如下程式碼是會報錯的
Queue queue = new Queue();//會報錯,Queue是介面,不允許例項化
複製程式碼
正確的用法是
Queue queue = new LinkedList();// 正確的用法,基於連結串列來實現
複製程式碼
佇列的連結串列實現是通過子類LinkedList來實現的,Queue介面收窄了LinkedList的訪問許可權,只提供從隊尾,隊頭等的操作。
為了加深大家的印象,我舉一個例子,噁心了一點,但保證大家能記住,大家在喝啤酒的過程中,正常去廁所小解的,這個過程叫做隊例。喝多了吐出來的過程,叫做棧。
以上就是Java線性表的介紹,面試中會經常被問起,後續文章會把重點都說一下,希望對大家能有所幫助。
上一篇:Arraylist與Vector的區別 - Java那些事兒專欄
下一篇:待續
注:本專欄文章首發於公眾號:saysayJava。所有示例程式碼均已上傳至公眾號,需要請關注下載。
如果喜歡本系列文章,請為我點贊或順手分享,您的支援是我繼續下去的動力,您也可以在評論區留言想了解的內容,有機會本專欄會做講解,最後別忘了關注一下我。
轉載無限歡迎,但請註明「作者」和「原文地址」。轉載請在文中保留此段,感謝您對作者版權的尊重。如需商業轉載或刊登,請聯絡作者獲得授權