數組不管在哪一種編程語言中都算是最重要的數據結構之一,同時不一樣語言的實現及處理也不盡相同。但凡寫過一些程序的人都知道數組的價值及理解數組的重要性,與鏈表一道,數組成爲了基本的數據結構。儘管Java提供了很棒的集合API和集合類如:ArrayList、HashMap,他們內部都是基於數組。若是你是來自於基於c或c++背景的程序員,那麼你會發現一些關於數組的行爲和如何在Java工做中的異同。最值得注意的是C中的數組與Java中的數組的邊界檢查,c編譯器不檢查若是程序訪問無效的數組索引,而java若是程序嘗試訪問無效的數組索引的話jvm會拋出ArrayIndexOutOfBoundException。在這篇文章中,咱們看看Java中的數組,包括原生類型和對象類型的數組,下面就介紹些有關Java數組及屬性的知識點。html
Java數組101java
(譯註:101指介紹某件事,讀者不須要任何預備知識)c++
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)數組一個固定長度 的數據結構,一旦聲明,你不能改變數組的長度。jvm
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拋出ArrayStoreExceptionspa
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等數據結構。
以上就是全部關於數組的話題,如你所見,數組是一種很是強大的數據結構。
原文連接: javarevisited 翻譯: ImportNew.com - 劉志軍
譯文連接: http://www.importnew.com/7127.html
[ 轉載請保留原文出處、譯者和譯文連接。]