淺析 數組

數組無論在哪種編程語言中都算是最重要的數據結構之一,同時不同語言的實現及處理也不盡相同。但凡寫過一些程序的人都知道數組的價值及理解數組的重要性,與鏈表一道,數組成爲了基本的數據結構。

1)數組在Java中是一個對象,數組實例同樣是使用new操作符創建的。Array.length指定了數組長度,例如:

1
2
3
4
int[] intArray = new int[10];
System.out.println(intArray.length)
 
Output: 10

 

Array.length 表示數組的容量,只要數組創建了,每一個索引被初始化爲默認值。

2)數組索引起始爲0,負數索引在Java中是無效的,會拋出ArrayIndexOutOfBoundException ,如果你嘗試用無效的索引訪問數組,這個無效的索引可能是一個負索引,或者是大於等於數組長度的索引。

3)數組存儲在Java堆的連續內存空間,所以如果你創建一個大的索引,你可以有足夠的堆空間直到拋出OutofmemoryError,因爲請求的內存大小在連續的內存空間不可用。

4)數組一個固定長度 的數據結構,一旦聲明,你不能改變數組的長度。

5)不同類型的數組有不同的類型,例如下面例子,intArray.getClass()不同於floatArray.getClass()

1
2
int[] intArray = new int[10];
float[] floatArray = new float[10];
1
6)你不能存儲double值在int數組中,否則導致編譯錯誤。
1
2
int[] intArray = new int[10];
intArray[5]=1.2; //compilation error

如果嘗試在運行時做這個操作,那麼Java拋出ArrayStoreException

7)在Java數組中可以有不同方式的創建方式,這裏就是創建數組的例子:

1
2
3
4
int[] intArray;   //creating array without initializing or specifying size
int intArray1[];  //another int[] reference variable can hold reference of an integer array
int[] intArray2 = new int[10]; //creating array by specifying size
int[] intArray3 = new int[]{1,2,3,4}; //creating and initializing array in same line.

你既可以選擇在創建數組的時候初始化數組,也可以以後通過for循環初始化,中括號既可以在變量的前面也可以在變量後面。

第一種方法是方便的創建多個數組如:

int[] array1, array2

這裏的array1和array2是整型數組,而第二種方法你需要放兩次括號如:

int array1[], array2[]

儘管在風格上沒有很多不同,我讀“int[] ”叫int數組,這種寫法更容易被理解。

8)如果沒有明確的初始化數組元素,那麼數組就會用默認的類型值初始化,例如假若沒有初始化整型數組,元素都將默認值爲0,沒有初始化的boolean值是false,對象數組是null。

9)你可以通過使用[]操作符訪問數組元素,因爲數組索引起始於0,[0]返回第一個元素,[length-1]返回最後一個元素,for循環是一種迭代整個數組便捷方法。你可以使用for循環初始化整個數組、訪問的每個索引或更新、獲取數組元素。Java5同樣提供了加強的for循環,數組自己管理索引,防止ArrayIndexOutOfBoundException,這裏是一個迭代的例子:

傳統的方式:

1
2
3
4
5
6
7
8
9
10
11
12
int[] numbers = new int[]{10, 20, 30, 40, 50};
 
for (int i = 0; i < numbers.length; i++) {
  System.out.println("element at index " + i + ": " + numbers[i]);
}
 
Output:
element at index 0: 10
element at index 1: 20
element at index 2: 30
element at index 3: 40
element at index 4: 50

 

加強的for循環

1
2
3
4
5
6
7
8
9
10
for(int i: numbers){
   System.out.println(i);
}
 
Output:
10
20
30
40
50

正如你看到的,加強的for循環不需要檢查數組索引,如果你想逐個地訪問所有的元素這是一種很好的方法,但是同時因爲你不能訪問索引,你就不能修改數組元素。

10)Java中數組可以輕易的轉換成ArrayList。ArrayList一個基於索引的集合,它是作爲數組的備選方案。ArrayList的優點是可以改變容量大小,只需要創建個更大的數組然後拷貝內容到新數組,但你不能改變數組的大小。

11)Java API同樣提供了一些便捷方法通過java.utils.Arrays類去操作數組,通過使用Arrays你可以排序數組,你可以做二分搜索。

12)java.lang.System類提供了實用方法拷貝元素到另一個數組。在拷貝內容從一個數組到另一個數組的時候System.arrayCopy非常強大和靈活。你可以拷貝整個或子數組,具體看你的需求。

System.arraycoy語法:

1
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

如你所見,arraycopy允許我們指定索引和長度,能很靈活給你拷貝子數組和存儲到需要的位置或目標數組。這裏是一個例子,拷貝前三個元素到目標數組:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public static void main(String args[]) {
        int[] source = new int[]{10, 20, 30, 40, 50};
        int[] target = new int[5];
 
        System.out.println("Before copying");
        for(int i: target){
            System.out.println(i);
        }
 
        System.arraycopy(source, 0, target, 0, 3);
 
        System.out.println("after copying");
        for(int i: target){
            System.out.println(i);
        }
    }
Output:
Before copying
0
0
0
0
0
after copying
10
20
30
0
0

你可以看到拷貝之前所有元素是0,之後前三個元素被替換了。

13)Java同樣支持多維數組,在表示2D和3D的時候非常有用,像行和列或矩陣。多維數組也是一個數組的數組,這裏是創建多維數組的例子:

1
int[][] multiArray = new int[2][3];

這是數組有2行3列,或者說長度是2的數組中,它的每個元素裏保存的是長度爲3的數組,這裏是初始化多維數組的例子:

1
2
3
int[][] multiArray = {{1,2,3},{10,20,30}};
System.out.println(multiArray[0].length);
System.out.println(multiArray[1].length);
1
 
1
 

14)數組是一種非常快的數據結構,如果你已經知道元素的長度,那麼就應該使用數組而非ArrayList等數據結構。


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