站在JAVA資料結構的視角看待簡單表結構

2021-09-14 06:54:17 字數 2194 閱讀 7636

1.前言:

我們提到程式中的集合的時候,往往腦海中會浮現出, 如arraylist和linkedlist以及和hashmap。當然在提到arraylist和linkedlist的時候,我們大多數的人都知道一點:arraylist查詢速度快,操作速度慢。linkedlist查詢速度慢,但是操作速度快。但是why ? 為什麼會是這樣的現象? 那麼接下我從資料結構角度帶大家一起去認識下這個問題。

2.資料結構 --- 線性表

資料結構是計算機儲存、組織資料的方式。

資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。

上述概念得出:資料結構 = 資料儲存 + 資料集合。

線性表: 線性表是乙個線性結構,它是乙個含有n≥0個結點的有限序列,對於其中的結點,有且僅有乙個開始結點沒有前驅但有乙個後繼結點,有且僅有乙個終端結點沒有後繼但有乙個前驅結點,其它的結點都有且僅有乙個前驅和乙個後繼結點。

在數學的角度 執行緒表a = ,那麼我們稱之為 an-1 是 an 的前驅元 ,an+1 是後繼元。

3.儲存方式

我們簡單的認識了線性表的結構 ,那麼根據計算機儲存不同, 我們將線性表分類成為:線性儲存和鏈式儲存。

3.1 線性儲存

線性表中線性儲存表示我們資料結構在中的元素在儲存元素的時候是按照順序在計算機記憶體中儲存。 典型代表:arraylist

線性儲存的設計資料結構需要包含以下:

i. 起始位置

ii. 陣列

iii. 表空間元素儲存位置

從上面我們可以看的出來,我們在設計執行緒表的時候是通過陣列的形式來維護的資料結構的關係,不需要我們自行設計邏輯關係的維護。

陣列在維護邏輯關係上來說,由於陣列本身包含記錄著元素索引。索引搜尋起來的速度較快。

缺點:

由於是由陣列維護資料結構,會產生一些問題?

第一. 在實現元素的新增的時候,涉及的乙個問題就是陣列的自動擴容策略。

順序儲存的線性鍊錶在選擇自動擴容的測試就是陣列的拷貝。

其中自動擴容選擇了arrays.copyof(elementdata, newcapacity) 陣列的拷貝實現。

那麼陣列在拷貝的時候,就是涉及到 資料結構中的元素的大量的拷貝遷移

從圖一到圖二的過度,是我們線性表的自動擴容的過程,涉及到的步驟有陣列的新建和元素的拷貝,這樣就額外的增加了效能開銷。

第二. 空間碎片問題

我們在使用陣列開闢記憶體空間, 但是當我們並沒有使用完陣列的開闢的空間時候,那麼剩餘未被使用的空間就會被一直占用不能被釋放出來,造成了空間的浪費,這稱之為空間碎片

3.2 鏈式儲存

線性表中鏈式儲存存表示我們資料結構在中的元素在儲存元素的時候是隨機存放在計算機記憶體中可用的區域儲存。這樣可以更好的利用記憶體空間 。典型代表linkedlist

鏈式儲存的線性表結構:設計時不使用陣列來維護元素的邏輯關係,需要我們設計節點來描述資料結構中的元素關係。

節點之間需要我們去維護 「 鄰居關係」, 使用任意一組儲存單元儲存元素,線性表之間的線性邏輯關係是通過這組儲存單元中的指標域去指向下一組儲存單元,下一組儲存單元可以放在任意位置。

那麼通過上面的資料結構我們可以看出,鏈式儲存的線性表的邏輯關係是通過指標域儲存邏輯關係,所以記憶體上的分布是邏輯上的關聯,而物理上是分離的。

這樣設計的好處在於,提公升了記憶體的使用效率,避免了空間碎片問題。邏輯關係可以自行維護。那麼在實現新增或者刪除邏輯操作會更加高效。

Java資料結構

arraylist 基於 array,在記憶體中占有連續空間,所以get index 時候,根據陣列首位址 偏移量就可以取到值 linklist 基於link,在記憶體中不連續,每個元素只知道下乙個元素,所以get時候,只能從首元素開始乙個乙個去找,效率相對較慢 增加刪除 arraylist 需要變...

java 資料結構

private void initmap log.d tag,map.tostring log.d tag,weakmap.tostring log.d tag,treemap.tostring log.d tag,hamap.tostring log.d tag,linkmap.tostring ...

Java的資料結構原理

1.線性表 一種邏輯結構,相同資料型別的n個資料元素的有限序列,除第乙個元素外,每個元素有且僅有乙個直接前驅,除最後乙個元素外,每個元素有且僅有乙個直接後繼。1 元素個數有限 2 邏輯上元素有先後次序 3 資料型別相同 4 僅討論元素間的邏輯關係 2.佇列 佇列是一種操作受限的線性表 只允許在表的一...