1. 程式人生 > >Java基礎(五):陣列

Java基礎(五):陣列

> 陣列,一種應用非常廣泛的資料結構,簡單地來說就是一組**型別相同**且**無序**的元素的儲存在**固定長度**且**有序**的記憶體空間。 ### 建立一個數組 在Java中,我們可以通過`[]`去宣告一個指定型別的陣列 ```java int[] a; // 寫法一 int a[]; // 寫法二 ``` 當然,一般情況下我們更喜歡使用第一種方式來宣告一個數組,因為它將型別與變數名分開,優化了程式碼的可讀性。 剛剛我們只是聲明瞭一個數組 a ,但是並沒有將 a 初始化為一個真正的陣列。 在給陣列賦值時,我們可以通過三種方式 ```java int[] a = new int[4]; int[] a = new int[]{1,2,3,4}; int[] a = {1,4,3,2} ``` 其中第三種實際上是第二種的簡寫,我們可以通過使用 new 關鍵字去建立一個匿名的陣列 ```java new int[4]; ``` 但是記得一定要指定長度或者指定陣列中的元素,這裡如果想要建立一個匿名的陣列,new關鍵字是必不可少的 ```java {1,2,4,3} // 這樣寫是錯誤的! ``` 無論我們怎麼去定義一個數組,它的長度在建立之初都是被確定的,但是需要注意一點,它的長度也不是無窮無盡的,我們可以通過檢視反射包中的`Array`類原始碼獲得它的長度資料型別: ```java public static Object newInstance(Class componentType, int length) throws NegativeArraySizeException { return newArray(componentType, length); } ``` 這裡可以看到陣列的資料型別是int型別,而int型別在前面我們也提過,它的最大長度是$2^{31}$,也就是2GB。 ### 訪問陣列中的元素 我們可以通過下標的方式來訪問陣列中的元素,陣列的下標從0開始,最大長度是陣列的長度,如果我們訪問超出陣列下標範圍的資料,就會丟擲索引越界異常( ArrayOutOfIndexError ),因為我們可以通過下標直接訪問陣列中的元素,所以時間複雜度是O(1)。 ```java int[] a = {1,2,3}; System.out.println(a[0]); // 1 ``` ### 往陣列中新增元素 剛剛我們說過,陣列中的長度是固定的,所以我們無法去改變該陣列的結構,但是我們可以通過另外一種方法來實現這樣的效果 ```java int[] arr = {9,7,5}; int[] temp = new int[arr.length+1]; for(int i = 0;i < arr.length;i++) { temp[i]=arr[i]; } temp[arr.length] = 6; arr = temp; ``` 我們來畫圖分析一下 ![image-20190826222706460](http://viyoungblog.oss-cn-beijing.aliyuncs.com/2019-08-26-142707.png) ### 刪除元素 和新增一樣,刪除陣列中的元素同樣是不允許的,我們可以通過和新增類似的方式來完成刪除的操作 ```java int[] arr = { 1, 2, 3, 4, 5}; int[] tmp = new int[arr.length - 1]; for (int i = 0; i < tmp.length; i++) { tmp[i] = arr[i]; } arr = tmp; ``` 原理上和新增是比較類似的,這裡我就不再畫圖去詳細的說明了 ### 二維陣列 我們像建立一維陣列一樣可以建立一個二維陣列 ```java int[][] doubleArr = new int[2][3]; int[][] doubleArr = {{1,2,3,4},{5,6,7,8}}; int[][] doubleArr = new int[5][]; ``` 這裡需要注意一點,二維陣列的建立時,可以指定一個維度的長度,而不指定第二維度的長度,使之動態的變化。比如我們可以畫個星星 ```java String[][] arr = new String[5][]; for (int i = 0; i < arr.length; i++) { arr[i] = new String[i + 1]; for (int j = 0; j < arr[i].length;j++) { arr[i][j] = "*"; } } for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length;j++) { System.out.print(arr[i][j]); } System.out.println(); } ``` ![image-20190826231109164](http://viyoungblog.oss-cn-beijing.aliyuncs.com/2019-08-26-151109.png) ### 公眾號 ![](http://viyoungblog.oss-cn-beijing.aliyuncs.com/viyoung/2020-03-15-qrcode_for_gh_a65beceb0947_