您好,登錄后才能下訂單哦!
前言
數組,最基礎的一種數據結構。盡管看起來非常的簡單、基礎,但是面試往往逃不過它。
特性
如何實現隨機訪問
從上面的特性可以得到幾個關鍵詞:
1.線性表。線性表就是數據排成一條線一樣的結構。只有前后兩個關系。比如:數組、鏈表、棧、隊列等;
2.連續的內存空間和相同類型的數據。所以你所回答的不適合insert、delete就是基于這個原因,為了保持它的連續性。
數組根據下標實現隨機訪問數組元素的公式:
a[i]_address = base_address + i * data_type_size
其中,base_address為數組內存塊的首地址,data_type_size 為元素大小(比如,數據類型為int,則data_type_size 為4)
如何動態擴容
數組本身在定義的時候就是需要預先指定大小的,因為需要分配連續的內存空間。
以ArrayList來說,每次存儲空間不足的時,它都會將空間自動擴容1.5倍。
但是擴容操作涉及到內存申請和數據遷移,比較耗時,所以事先指定好大小是可以優化性能的。
ArrayList給定的默認容量大小是10:
/** * Default initial capacity. */ private static final int DEFAULT_CAPACITY = 10;
擴容源碼:
/** * Increases the capacity to ensure that it can hold at least the * number of elements specified by the minimum capacity argument. * * @param minCapacity the desired minimum capacity */ private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
最后
想著還是來一波面試題吧
代碼如下:
public static void main(String[] args) { int a=10; int b=20; System.out.println("a="+a+" b="+b); change(a, b); System.out.println("a="+a+" b="+b); } public static void change(int a,int b) { a=b; b=a+b; System.out.println("a="+a+" b="+b); }
輸出結果:
a=10 b=20 a=20 b=40 a=10 b=20
如果改成數組呢,結果是否有變?
public static void main(String[] args) { int[] arr = {9,3,4,5,6}; change(arr); System.out.println(arr[1]); } public static void change(int[] arr) { for(int i=0;i<arr.length;i++) { if(arr[i] % 3 == 0) { arr[i]*=2; } } }
輸出結果:
6
是不是似曾相識,在某場筆試中?記得之前在某公司面試的時候,就出現了這樣的題,雖說讓我給蒙中了,但是面試官貌似對我很有興趣(PS:手動狗頭),一問到底,為!什!么!你的答案是這樣的,來,說說你的思路Or理解。
當時很想說出我的心里話:我蒙的,你信嗎?
簡單吹了一波:
所以你知道java中到底是傳遞值還是傳遞地址呢?
你可以大聲告訴你的面試官:值。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。