數組無論在哪種編程語言中都算是最重要的數據結構之一,同時不同語言的實現及處理也不盡相同。但凡寫過一些程序的人都知道數組的價值及理解數組的重要性,與鏈表一道,數組成爲了基本的數據結構。儘管Java提供了很棒的集合API和集合類如:ArrayList、HashMap,他們內部都是基於數組。如果你是來自於基於c或c++背景的程序員,那麼你會發現一些關於數組的行爲和如何在Java工作中的異同。最值得注意的是C中的數組與Java中的數組的邊界檢查,c編譯器不檢查如果程序訪問無效的數組索引,而java如果程序嘗試訪問無效的數組索引的話jvm會拋出ArrayIndexOutOfBoundException。在這篇文章中,我們看看Java中的數組,包括原生類型和對象類型的數組,下面就介紹些有關Java數組及屬性的知識點。
Java數組
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等數據結構。
以上就是所有關於數組的話題,如你所見,數組是一種非常強大的數據結構。