1、什麼是數組?
數組(Array)是一種線性表數據結構,它用一組連續的內存空間,來存儲相同類型的數據。
2 、什麼是線性表(Linear List)?
線性表就是數據排成一條線一樣的結構,每個線性表的數據最多隻有前後兩個方向。
例如:數組,鏈表,隊列,棧 等都是線性表結構。
3、 什麼是非線性表?
例如:二叉樹,堆,圖,等,是非線性表,是因爲,在非線性表中,數據之間並不是簡單的前後關係。
4、 數組是如何隨機訪問數組元素?
數組是如何實現根據下標隨機訪問數組元素的嗎?
例如: int[]a=newint[10]
1,計算機給數組a[10],分配了一組連續的內存空間。2,比如內存塊的首地址爲 base_address=1000。3,當計算給每個內存單元分配一個地址,計算機通過地址來訪問數據。當計算機需要訪問數組的某個元素的時候,會通過一個尋址公式來計算存儲的內存地址。
公式如下:
a[i]_address = base_address + i * data_type_size
arr[i] 首地址 = 數組內存塊首地址 + 數據類型大小 * i ,其中i爲偏移量。
baseaddress:內存塊的首地址。datatype_size:數組中每個元素的大小,比如每個元素大小是4個字節。
1,數組使用二分法查找元素,時間複雜度是O(logn)。2,根據下標隨機訪問的時間複雜度是O(1)。
5、數組如何提高效率?
將多次刪除操作中集中在一起執行,可以先記錄已經刪除的數據,但是不進行數據遷移,而僅僅是記錄,當發現沒有更多空間存儲時,再執行真正的刪除操作,這樣減少數據搬移次數節省耗時。
這也是跟 JVM 標記清除垃圾回收算法的核心思想相似。
標記-整理垃圾回收算法。
在垃圾收集時此算法分爲“標記”、“清除”兩個階段,先標記出需要回收的對象,再統一清除標記的對象。清除之後會產生大量不連續的內存碎片。
標記-整理垃圾回收算法
在標記完成之後讓所有存活的對象都向一端移動,然後直接清理掉邊界以外的內存。
6、用數組還是容器?
數組先指定容器大小,容器ArrayList可以動態擴容,並且封裝了好多方法,一旦超過存儲容量,擴容時比較耗時,因爲涉及內存申請和數據複製搬移到擴容後的數組。
如果已知數據大小,且涉及的數據操作比較簡單,可以用數組。2,比如已知 1 萬條數據要存入 ArrayList,我們就可以事先指定容器大小。
例如下代碼,就可以,省掉多次的,內存申請,和數據搬移操作
- ArrayList<User> users = new ArrayList(10000);
- for (int i = 0; i < 10000; ++i) {
- users.add(xxx);
- }
容器無法存儲基本類型,比如 int long 需要轉換成包裝類型,類型的轉換有性能消耗。4,業務開發,使用容器足夠,追求性能,首先用數組。
7、爲什麼數組要從 0 開始編號,而不是1?
從偏移角度理解a[0] 0爲偏移量,如果從1計數,會多出K-1,增加cpu負擔。