Java面試之數組(詳細)

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,我們就可以事先指定容器大小。

例如下代碼,就可以,省掉多次的,內存申請,和數據搬移操作

  1. ArrayList<User> users = new ArrayList(10000);
  2. for (int i = 0; i < 10000; ++i) {
  3. users.add(xxx);
  4. }

容器無法存儲基本類型,比如 int long 需要轉換成包裝類型,類型的轉換有性能消耗。4,業務開發,使用容器足夠,追求性能,首先用數組。

 

7、爲什麼數組要從 0 開始編號,而不是1?

從偏移角度理解a[0] 0爲偏移量,如果從1計數,會多出K-1,增加cpu負擔。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章