這篇文章咱們來講說Java裏一個很重要的數據結構——線性表,仍是這張圖,線性表對應着下圖裏的List。java
紅框裏的內容就是線性表的你們族了,其中黃色部分是要重點了解的,線性表裏的元素是按線性排列的(這裏的線性指邏輯上的) 線性表分爲兩大類,分別是順序表和鏈表:數組
順序表中的數據元素存儲是連續的,內存劃分的區域也是連續的。存儲結構以下圖:數據結構
咱們的ArrayList底層是數組實現的,底層元素在內存中是按順序排列的,ArrayList是Java中順序表的體現。spa
鏈表在物理存儲上一般是非連續、非順序的方式存儲的,數據元素的邏輯順序是經過鏈表中的引用來實現的。3d
很簡單,內存中的對象是隨機分佈的,對象不但存儲了張3、李四等數據,還持有一個next引用,指向下一個對象,來肯定一組對象的邏輯順序。code
也很簡單,和單向鏈表同樣,只不過最後一個對象的next又指向了第一個對象。對象
不但持有next引用,指向下一個對象,還持有一個prev引用,指向上一個對象。blog
記住雙向鏈表這個圖,很重要,下一篇文章咱們要講的LinkedList就是以雙向鏈表的方式實現的。接口
棧和隊列是兩種比較特殊的線性表。隊列
棧是一種操做受限制的線性表。其限制是僅容許在線性表的尾部進行添加和刪除操做,這一端被稱爲棧頂,另外一端稱爲棧底。向一個棧添加新元素叫壓棧,刪除元素又稱爲出棧。
如上圖,把趙六放入到棧中叫壓棧,不放入趙六,直接取出(刪除)王五的過程叫出棧,只能從棧頂放入和刪除元素。本文第一張圖裏的Stack就是棧在Java中的實現。舉個例子,最後洗好的盤子都是疊放在最上面的,但每次用的時候都是從最上面拿,最早洗好的盤子反而不容易用到。
隊列也是一種操做受限制的線性表。只能從頭部刪除(取出)元素,從隊尾添加元素,進行刪除操做的端稱爲隊頭。
看上面的圖,只能從隊尾添加元素,隊頭取出(刪除)元素。本文第一張圖裏的Queue就是隊列的體現,Queue是基於鏈表來體現的。注意,Queue是一個接口,直接寫以下代碼是會報錯的
Queue queue = new Queue();//會報錯,Queue是接口,不容許實例化
正確的用法是
Queue queue = new LinkedList();// 正確的用法,基於鏈表來實現
隊列的鏈表實現是經過子類LinkedList來實現的,Queue接口收窄了LinkedList的訪問權限,只提供從隊尾,隊頭等的操做。
爲了加深你們的印象,我舉一個例子,噁心了一點,但保證你們能記住,你們在喝啤酒的過程當中,正常去廁所小解的,這個過程叫作隊例。喝多了吐出來的過程,叫作棧。