Java數(shù)組
數(shù)組無(wú)論在哪種編程語(yǔ)言中都算是最重要的數(shù)據(jù)結(jié)構(gòu)之一,同時(shí)不同語(yǔ)言的實(shí)現(xiàn)及處理也不盡相同。但凡寫(xiě)過(guò)一些程序的人都知道數(shù)組的價(jià)值及理解數(shù)組的重要性,與鏈表一道,數(shù)組成為了基本的數(shù)據(jù)結(jié)構(gòu)。盡管Java提供了很棒的集合API和集合類(lèi)如:ArrayList、HashMap,他們內(nèi)部都是基于數(shù)組。如果你是來(lái)自于基于c或c++背景的程序員,那么你會(huì)發(fā)現(xiàn)一些關(guān)于數(shù)組的行為和如何在Java工作中的異同。最值得注意的是C中的數(shù)組與Java中的數(shù)組的邊界檢查,c編譯器不檢查如果程序訪問(wèn)無(wú)效的數(shù)組索引,而java如果程序嘗試訪問(wèn)無(wú)效的數(shù)組索引的話(huà)jvm會(huì)拋出ArrayIndexOutOfBoundException。在這篇文章中,我們看看Java中的數(shù)組,包括原生類(lèi)型和對(duì)象類(lèi)型的數(shù)組,下面就介紹些有關(guān)Java數(shù)組及屬性的知識(shí)點(diǎn)。
Java數(shù)組101
(譯注:101指介紹某件事,讀者不需要任何預(yù)備知識(shí))
1)數(shù)組在Java中是一個(gè)對(duì)象,數(shù)組實(shí)例同樣是使用new操作符創(chuàng)建的。Array.length指定了數(shù)組長(zhǎng)度,例如:
int[] intArray = new int[10];
System.out.println(intArray.length)
Output: 10
Array.length 表示數(shù)組的容量,只要數(shù)組創(chuàng)建了,每一個(gè)索引被初始化為默認(rèn)值。
2)數(shù)組索引起始為0,負(fù)數(shù)索引在Java中是無(wú)效的,會(huì)拋出ArrayIndexOutOfBoundException ,如果你嘗試用無(wú)效的索引訪問(wèn)數(shù)組,這個(gè)無(wú)效的索引可能是一個(gè)負(fù)索引,或者是大于等于數(shù)組長(zhǎng)度的索引。
3)數(shù)組存儲(chǔ)在Java堆的連續(xù)內(nèi)存空間,所以如果你創(chuàng)建一個(gè)大的索引,你可以有足夠的堆空間直到拋出OutofmemoryError,因?yàn)檎?qǐng)求的內(nèi)存大小在連續(xù)的內(nèi)存空間不可用。
4)數(shù)組一個(gè)固定長(zhǎng)度 的數(shù)據(jù)結(jié)構(gòu),一旦聲明,你不能改變數(shù)組的長(zhǎng)度。
5)不同類(lèi)型的數(shù)組有不同的類(lèi)型,例如下面例子,intArray.getClass()不同于floatArray.getClass()
int[] intArray = new int[10];
float[] floatArray = new float[10];
6)你不能存儲(chǔ)double值在int數(shù)組中,否則導(dǎo)致編譯錯(cuò)誤。
int[] intArray = new int[10];
intArray[5]=1.2; //compilation error
如果嘗試在運(yùn)行時(shí)做這個(gè)操作,那么Java拋出ArrayStoreException
7)在Java數(shù)組中可以有不同方式的創(chuàng)建方式,這里就是創(chuàng)建數(shù)組的例子:
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.
你既可以選擇在創(chuàng)建數(shù)組的時(shí)候初始化數(shù)組,也可以以后通過(guò)for循環(huán)初始化,中括號(hào)既可以在變量的前面也可以在變量后面。
第一種方法是方便的創(chuàng)建多個(gè)數(shù)組如:
int[] array1, array2
這里的array1和array2是整型數(shù)組,而第二種方法你需要放兩次括號(hào)如:
int array1[], array2[]
盡管在風(fēng)格上沒(méi)有很多不同,我讀“int[] ”叫int數(shù)組,這種寫(xiě)法更容易被理解。
8)如果沒(méi)有明確的初始化數(shù)組元素,那么數(shù)組就會(huì)用默認(rèn)的類(lèi)型值初始化,例如假若沒(méi)有初始化整型數(shù)組,元素都將默認(rèn)值為0,沒(méi)有初始化的boolean值是false,對(duì)象數(shù)組是null。
9)你可以通過(guò)使用[]操作符訪問(wèn)數(shù)組元素,因?yàn)閿?shù)組索引起始于0,[0]返回第一個(gè)元素,[length-1]返回最后一個(gè)元素,for循環(huán)是一種迭代整個(gè)數(shù)組便捷方法。你可以使用for循環(huán)初始化整個(gè)數(shù)組、訪問(wèn)的每個(gè)索引或更新、獲取數(shù)組元素。Java5同樣提供了加強(qiáng)的for循環(huán),數(shù)組自己管理索引,防止ArrayIndexOutOfBoundException,這里是一個(gè)迭代的例子:
傳統(tǒng)的方式:
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
加強(qiáng)的for循環(huán)
for(int i: numbers){
System.out.println(i);
}
Output:
10
20
30
40
50
正如你看到的,加強(qiáng)的for循環(huán)不需要檢查數(shù)組索引,如果你想逐個(gè)地訪問(wèn)所有的元素這是一種很好的方法,但是同時(shí)因?yàn)槟悴荒茉L問(wèn)索引,你就不能修改數(shù)組元素。
10)Java中數(shù)組可以輕易的轉(zhuǎn)換成ArrayList。ArrayList一個(gè)基于索引的集合,它是作為數(shù)組的備選方案。ArrayList的優(yōu)點(diǎn)是可以改變?nèi)萘看笮?,只需要?jiǎng)?chuàng)建個(gè)更大的數(shù)組然后拷貝內(nèi)容到新數(shù)組,但你不能改變數(shù)組的大小。
11)Java API同樣提供了一些便捷方法通過(guò)java.utils.Arrays類(lèi)去操作數(shù)組,通過(guò)使用Arrays你可以排序數(shù)組,你可以做二分搜索。
12)java.lang.System類(lèi)提供了實(shí)用方法拷貝元素到另一個(gè)數(shù)組。在拷貝內(nèi)容從一個(gè)數(shù)組到另一個(gè)數(shù)組的時(shí)候System.arrayCopy非常強(qiáng)大和靈活。你可以拷貝整個(gè)或子數(shù)組,具體看你的需求。
System.arraycoy語(yǔ)法:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
如你所見(jiàn),arraycopy允許我們指定索引和長(zhǎng)度,能很靈活給你拷貝子數(shù)組和存儲(chǔ)到需要的位置或目標(biāo)數(shù)組。這里是一個(gè)例子,拷貝前三個(gè)元素到目標(biāo)數(shù)組:
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,之后前三個(gè)元素被替換了。
13)Java同樣支持多維數(shù)組,在表示2D和3D的時(shí)候非常有用,像行和列或矩陣。多維數(shù)組也是一個(gè)數(shù)組的數(shù)組,這里是創(chuàng)建多維數(shù)組的例子:
int[][] multiArray = new int[2][3];
這是數(shù)組有2行3列,或者說(shuō)長(zhǎng)度是2的數(shù)組中,它的每個(gè)元素里保存的是長(zhǎng)度為3的數(shù)組,這里是初始化多維數(shù)組的例子:
int[][] multiArray = {{1,2,3},{10,20,30}};
System.out.println(multiArray[0].length);
System.out.println(multiArray[1].length);
14)數(shù)組是一種非??斓臄?shù)據(jù)結(jié)構(gòu),如果你已經(jīng)知道元素的長(zhǎng)度,那么就應(yīng)該使用數(shù)組而非ArrayList等數(shù)據(jù)結(jié)構(gòu)。
以上就是所有關(guān)于數(shù)組的話(huà)題,如你所見(jiàn),數(shù)組是一種非常強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)。