1.前言:java
咱們提到程序中的集合的時候,每每腦海中會浮現出, 如ArrayList和LinkedList以及和HashMap。固然在提到ArrayList和LinkedList的時候,咱們大多數的人都知道一點:ArrayList查詢速度快,操做速度慢。LinkedList查詢速度慢,可是操做速度快。可是why ? 爲何會是這樣的現象? 那麼接下我從數據結構角度帶你們一塊兒去認識下這個問題。後端
2.數據結構 --- 線性表數組
數據結構是計算機存儲、組織數據的方式。數據結構
數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。性能
上述概念得出:數據結構 = 數據存儲 + 數據集合。測試
線性表: 線性表是一個線性結構,它是一個含有n≥0個結點的有限序列,對於其中的結點,有且僅有一個開始結點沒有前驅但有一個後繼結點,有且僅有一個終端結點沒有後繼但有一個前驅結點,其它的結點都有且僅有一個前驅和一個後繼結點。spa
在數學的角度 線程表A = { A0, A1, A2, ….. , An-1, An, An+1 } ,那麼咱們稱之爲 An-1 是 An 的前驅元 ,An+1 是後繼元。線程
3.存儲方式設計
咱們簡單的認識了線性表的結構 ,那麼根據計算機存儲不一樣, 咱們將線性表分類成爲:線性存儲和鏈式存儲。指針
3.1 線性存儲
線性表中線性儲存表示咱們數據結構在中的元素在存儲元素的時候是按照順序在計算機內存中存儲。 典型表明:ArrayList
線性存儲的設計數據結構須要包含如下:
I. 起始位置
II. 數組
III. 表空間元素存儲位置
從上面咱們能夠看的出來,咱們在設計線程表的時候是經過數組的形式來維護的數據結構的關係,不須要咱們自行設計邏輯關係的維護。
數組在維護邏輯關係上來講,因爲數組自己包含記錄着元素索引。索引搜索起來的速度較快。
缺點:
因爲是由數組維護數據結構,會產生一些問題?
第一. 在實現元素的添加的時候,涉及的一個問題就是數組的自動擴容策略。
順序存儲的線性鏈表在選擇自動擴容的測試就是數組的拷貝。
其中自動擴容選擇了Arrays.copyOf(elementData, newCapacity) 數組的拷貝實現。
那麼數組在拷貝的時候,就是涉及到 數據結構中的元素的大量的拷貝遷移
從圖一到圖二的過分,是咱們線性表的自動擴容的過程,涉及到的步驟有數組的新建和元素的拷貝,這樣就額外的增長了性能開銷。
第二. 空間碎片問題
咱們在使用數組開闢內存空間, 可是當咱們並無使用完數組的開闢的空間時候,那麼剩餘未被使用的空間就會被一直佔用不能被釋放出來,形成了空間的浪費,這稱之爲空間碎片
3.2 鏈式存儲
線性表中鏈式存儲存表示咱們數據結構在中的元素在存儲元素的時候是隨機存放在計算機內存中可用的區域存儲。這樣能夠更好的利用內存空間 。典型表明LinkedList
鏈式存儲的線性表結構:設計時不使用數組來維護元素的邏輯關係,須要咱們設計節點來描述數據結構中的元素關係。
節點之間須要咱們去維護 「 鄰居關係」, 使用任意一組存儲單元存儲元素,線性表之間的線性邏輯關係是經過這組存儲單元中的指針域去指向下一組存儲單元,下一組儲存單元能夠放在任意位置。
參考LinkedList源碼:
那麼經過上面的數據結構咱們能夠看出,鏈式存儲的線性表的邏輯關係是經過指針域存儲邏輯關係,因此內存上的分佈是邏輯上的關聯,而物理上是分離的。
這樣設計的好處在於,提高了內存的使用效率,避免了空間碎片問題。邏輯關係能夠自行維護。那麼在實現添加或者刪除邏輯操做會更加高效。
今天主要帶領你們從數據結構的視角認識咱們的簡單表結構。 學會了嗎? 不同的角度認識咱們的老朋友 ArrayList和LinkedList。接下來還有更多java後端相關知識奉上,請多多關注上海尚學堂JAVA培訓,期待下次見面。