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