Java數(shù)組

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)。

image

以上就是所有關(guān)于數(shù)組的話(huà)題,如你所見(jiàn),數(shù)組是一種非常強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)。

歡迎加入學(xué)習(xí)交流群569772982,大家一起學(xué)習(xí)交流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 數(shù)組類(lèi)型和數(shù)組引用變量詳解 數(shù)組類(lèi)型為什么要用數(shù)組?Java數(shù)組的兩大特征:定義數(shù)組時(shí),不能指定數(shù)組的長(zhǎng)度變量分為...
    Ansaxnsy閱讀 2,912評(píng)論 2 3
  • 一、學(xué)習(xí)要求 書(shū)籍參考章節(jié): 第3.10章節(jié) 學(xué)習(xí)目標(biāo): 掌握數(shù)組的基本概念 數(shù)組的定義和初始化 數(shù)組的操作 二、...
    我是老薛閱讀 793評(píng)論 0 1
  • 你是否經(jīng)常聽(tīng)到這樣的抱怨: 又是周一,真不想上班!工作沒(méi)意思,離開(kāi)又沒(méi)更好的出路,每天工作加班,累成狗,付出那么多...
    林瓏_閱讀 518評(píng)論 1 5
  • 提起種子,讓人不由得聯(lián)想到瓦礫中的生命,那樣的倔強(qiáng)頑強(qiáng)。 瓦礫中的種子,渴望早日破土而出,長(zhǎng)出新綠;而我這粒瘦弱的...
    小拓拓閱讀 513評(píng)論 0 1
  • “好是風(fēng)和日暖,輸與鶯鶯燕燕”。這是今天一直徘徊在腦海里的一句詞! 心里又莫名的低落了起來(lái)?;蛟S是因?yàn)樗瞄L(zhǎng)了;或...
    至少上帝在看呢閱讀 219評(píng)論 0 0