數組(Array)是一種線性表數據結構,他用一組連續的內存空間,來存儲一組具備相同類型的數據。算法
關鍵詞1:線性表:數組、鏈表、棧、隊列等都是線性表結構;每一個線性表上的數據最多隻有前和後兩個方向。編程
關鍵詞2:連續的內存空間和相同類型的數據。數組
因爲數組具備上述兩個限制,因此數組才具備殺手鐗般的特性:「隨機訪問」。網絡
數組數據的隨機訪問:數據結構
尋址公式:a[i]_address = base_address +i * data_type_size框架
數組與鏈表的區別:數組適合查找,支持隨機訪問,依據下標隨機訪問的時間複雜度爲O(1);鏈表適合插入和刪除,時間複雜度爲O(1)。數據結構和算法
ArrayList最大的優點是能夠將數組才作的細節封裝起來,好比數組插入、刪除數據時須要搬移其餘數據等,另一個優點就是支持動態擴容。編程語言
對於業務開發,直接使用容器就夠了,可是作一些很是底層的開發,好比開發網絡框架,須要將性能的優化作到極致,這時候數組就會優於容器成爲首選。post
從數組的內存模型來看,「下標」最確切的定義應該是「偏移(offset)」。若用a表示數組的首地址,a[0]就是偏移爲0的位置,a[k]就是偏移k個type_size的位置,因此計算a[k]的地址的公式爲:性能
a[k]_address = base_address + k * type_size
可是若是數組從1開始計數的話,尋址公式就會變成:
a[k]_address =base_address + ( k-1 ) * type_size
對比這兩個公式能夠發現,從1開始編號,每次隨機訪問數組元素都多了一次減法運算,對於CPU來說,就是多了一次減法指令。
二維數組a[m][n]的內存尋址公式:
a[i][j]_address =base_address + ( i * n + j ) * type_size