無任何技巧下直接暴力遍歷數組鏈表?
首先搞清楚數組和鏈表的差異。
數組是在一整塊連續的內存中存儲數據,每一項數組成員大小相同。保存數組需要記錄數組的起始地址、數組成員占用內存大小、數組長度;數組成員中記錄了數據、類型。
下面用一個便于理解的方式舉個關于數組的例子:
某數組起始位置在內存地址0上,每個數組成員占10byte,那么[0]在內存地址0,[2]在內存地址20,遍歷數組的方式是根據數組起始位置+索引*數組成員大小。
鏈表是存儲不需要一整塊連續的內存,保存鏈表只要記錄鏈表表頭地址即可;每一項鏈表成員中保存了數據、數據類型、下一個成員的地址,另雙向鏈表還會保存上一個成員的地址。
下面用一個便于理解的方式舉個關于鏈表的例子:
某鏈表的表頭在內存地址1000,訪問它可獲得數據和下一項數據地址是1234,遍歷鏈表的方式是依次訪問每一鏈的數據和下一鏈的地址,下一鏈的地址是直接獲取,不需要計算。
再來說說題主的問題,為什么通常只是遍歷那么鏈表性能略好一些,因為遍歷鏈表時少做了一個加法和一個乘法運算。
那么實際上為啥鏈表總得很少數組用得很多呢?
原因主要有2條:
一、按索引隨機訪問成員時數組的效率比鏈表高很多。即順序訪問鏈表性能略高于數組,隨機訪問數組性能遠高于鏈表。整體性能數組勝出。
二、使用數組時數組是連續存儲,產生的內存碎片的幾率和數量比鏈表少很多。
最后:所有的編程語言都支持數組,有相當多的編程語言不直接支持鏈表。因為鏈表的功能和數組的功能重疊,綜合性能略差,而且使用鏈表要直接接觸內存地址,容易產生內存地址越界、數據不安全的情況。