這篇文章咱們來講說Java裏一個很重要的數據結構——線性表,仍是這張圖,線性表對應着下圖裏的List。面試
紅框裏的內容就是線性表的你們族了,其中黃色部分是要重點了解的,線性表裏的元素是按線性排列的(這裏的線性指邏輯上的) 線性表分爲兩大類,分別是順序表和鏈表:數組
1、順序表bash
順序表中的數據元素存儲是連續的,內存劃分的區域也是連續的。存儲結構以下圖:數據結構
咱們的ArrayList底層是數組實現的,底層元素在內存中是按順序排列的,ArrayList是Java中順序表的體現。post
2、鏈表spa
鏈表在物理存儲上一般是非連續、非順序的方式存儲的,數據元素的邏輯順序是經過鏈表中的引用來實現的。3d
一、單向鏈表code
很簡單,內存中的對象是隨機分佈的,對象不但存儲了張3、李四等數據,還持有一個next引用,指向下一個對象,來肯定一組對象的邏輯順序。cdn
二、循環鏈表對象
也很簡單,和單向鏈表同樣,只不過最後一個對象的next又指向了第一個對象。
三、雙向鏈表
不但持有next引用,指向下一個對象,還持有一個prev引用,指向上一個對象。
記住雙向鏈表這個圖,很重要,下一篇文章咱們要講的LinkedList就是以雙向鏈表的方式實現的。
3、棧和隊列
棧和隊列是兩種比較特殊的線性表。
一、棧
棧是一種操做受限制的線性表。其限制是僅容許在線性表的尾部進行添加和刪除操做,這一端被稱爲棧頂,另外一端稱爲棧底。向一個棧添加新元素叫壓棧,刪除元素又稱爲出棧。
如上圖,把趙六放入到棧中叫壓棧,不放入趙六,直接取出(刪除)王五的過程叫出棧,只能從棧頂放入和刪除元素。本文第一張圖裏的Stack就是棧在Java中的實現。舉個例子,最後洗好的盤子都是疊放在最上面的,但每次用的時候都是從最上面拿,最早洗好的盤子反而不容易用到。
二、隊列
隊列也是一種操做受限制的線性表。只能從頭部刪除(取出)元素,從隊尾添加元素,進行刪除操做的端稱爲隊頭。
看上面的圖,只能從隊尾添加元素,隊頭取出(刪除)元素。本文第一張圖裏的Queue就是隊列的體現,Queue是基於鏈表來體現的。注意,Queue是一個接口,直接寫以下代碼是會報錯的
Queue queue = new Queue();//會報錯,Queue是接口,不容許實例化
複製代碼
正確的用法是
Queue queue = new LinkedList();// 正確的用法,基於鏈表來實現
複製代碼
隊列的鏈表實現是經過子類LinkedList來實現的,Queue接口收窄了LinkedList的訪問權限,只提供從隊尾,隊頭等的操做。
爲了加深你們的印象,我舉一個例子,噁心了一點,但保證你們能記住,你們在喝啤酒的過程當中,正常去廁所小解的,這個過程叫作隊例。喝多了吐出來的過程,叫作棧。
以上就是Java線性表的介紹,面試中會常常被問起,後續文章會把重點都說一下,但願對你們能有所幫助。
上一篇:Arraylist與Vector的區別 - Java那些事兒專欄
下一篇:待續
注:本專欄文章首發於公衆號:saysayJava。全部示例代碼均已上傳至公衆號,須要請關注下載。
若是喜歡本系列文章,請爲我點贊或順手分享,您的支持是我繼續下去的動力,您也能夠在評論區留言想了解的內容,有機會本專欄會作講解,最後別忘了關注一下我。
轉載無限歡迎,但請註明「做者」和「原文地址」。轉載請在文中保留此段,感謝您對做者版權的尊重。如需商業轉載或刊登,請聯繫做者得到受權