標籤:直接 長度 alt 佔用 固定 dao 迴圈鏈表 增加 縮減
數組和鏈表是資料結構中最基本的部分。
數組
在java中,數組定義為一種基本類型,其可以通過下標擷取到對應位置的資料。那麼這種結構的資料,在記憶體中是怎麼存放的呢?
數組在記憶體中是一段連續的儲存單元,每個資料依次放在每個單元中。
分析這種結構,我們可以得出以下幾個結論:
- 建立一個數組,必須聲明其長度,以在記憶體中尋找合適的一段連續儲存單元。這也意味著數組的大小是固定的,我們無法動態調整其大小。
- 想要擷取數組中第i個元素,其時間複雜度是 O(1),因為可以根據其地址直接找到它。同理修改也是。
- 數組對查詢表現一般,要想尋找一個元素,需要遍曆,時間複雜度為O(n)。
- 因為地址連續,想要在數組中插入一個元素是複雜的,因為從插入位置起,後邊的所有元素都需要向後移動一位。同理刪除也是,只是移動方向為向前。並且,當數組存滿時,就無法繼續插入了。
- 因為數組要佔據一整塊記憶體,有可能產生許多的片段,也可能因為找不到合適的記憶體塊,而導致儲存失敗。
總結起來就是:數組大小固定,尋找迅速,增刪複雜,需要完整的記憶體塊,容易產生片段。
鏈表
鏈表是一種離散儲存結構,其在記憶體中儲存不是連續的,每個資料元素都通過一個指標指向其下一個元素的地址。根據指標域的不同,鏈表又分為單鏈表、雙向鏈表、迴圈鏈表等,這裡我們只分析單鏈表。如下所示:
分析這種結構,我們可以得出以下幾個結論:
- 聲明一個鏈表時,不需要知道其長度,也不需要連續的記憶體塊,所以其大小可以動態調整。
- 鏈表的每個元素都分為資料域和指標域,前者是實際儲存的資料,後者則指向下一個元素的地址。和數組相比,每個元素需要佔用的記憶體更大了。
- 要擷取鏈表的第 i 個元素變得複雜,因為其地址存放在它上一個元素的指標域裡,所以只能從第一個元素起,進行 i 次操作。同理修改也是。
- 鏈表對查詢表現也一般,需要遍曆,時間複雜度為O(n)。
- 增加與刪除一個元素更方便了,因為沒有對記憶體位址的限制,我們只需要在對應節點合理處理下指標域的值,就可以把一個元素插入鏈表或者從鏈表刪除。
- 鏈表對記憶體的要求很小,只要能夠儲存下一個資料元素的記憶體塊都可以使用,因此不會造成片段化。
總結起來就是:大小可以動態調整,增刪迅速,尋找較慢,資料元素所佔記憶體略多,不需要整塊記憶體塊,不會造成片段化。
數組與鏈表的選擇
通過以上分析,數組和鏈表對我們影響最大的幾點區別在於:
- 數組按位置尋找迅速,鏈表增刪方便
- 數組是固定大小,鏈表可以隨時擴充與縮減
- 鏈表每個元素佔據記憶體略多於數組
- 數組和鏈表在查詢方面表現都比較一般,耗時較長
在資料量很小,內容基本固定時,我們選擇何種資料結構的影響並不大。
但當資料量較大時,如果我們需要對資料進行頻繁的插入刪除,我們應該選擇鏈表,如果我們需要頻繁的擷取某個位置的元素,我們應該選擇數組。
數組與鏈表並沒有明確的優劣之分,根據不同的使用情境進行不同的選擇,才是這兩種結構使用的最佳方式。
源碼:Java集合源碼之:數組與鏈表(一)