更新時(shí)間:2021年04月12日16時(shí)34分 來源:傳智教育 瀏覽次數(shù):
在Java中,數(shù)組的定義有三種方式,其基本語法格式如下:
數(shù)組類型[] 數(shù)組名 = new 數(shù)組類型[數(shù)組長度]; 數(shù)組類型[] 數(shù)組名 = new 數(shù)組類型[]{數(shù)組元素0,數(shù)組元素1,...}; 數(shù)組類型[] 數(shù)組名 = {數(shù)組元素0,數(shù)組元素1,...};
在上述三種定義數(shù)組的語法格式中,數(shù)組類型可以是前面小節(jié)中介紹的變量的數(shù)據(jù)類型,數(shù)組名就是定義的變量名,要符合標(biāo)識(shí)符的規(guī)范,數(shù)組長度表示該數(shù)組中可容納的數(shù)組元素的個(gè)數(shù),而數(shù)組元素0、數(shù)組元素1就表示定義的數(shù)組中具體包含的數(shù)據(jù)。
以上三種定義數(shù)組語法格式的實(shí)際使用示例如下:
int[] ids = new int[100]; String[] names = new String[]{"張三","tom",...}; Object[] object = {"張三","tom",...};
第一種方式定義了一個(gè)int[]數(shù)組類型的變量ids,使用new int[100]指定了該數(shù)組的長度(也就是元素的個(gè)數(shù))為100,但并沒有為數(shù)組中的元素賦值;第二種和第三種方式分別定義了一個(gè)String[]類型和Object[]類型的數(shù)組變量names和object,并都通過“=”右邊的大括號(hào)“{}”為數(shù)組完成了初始化賦值。
關(guān)于數(shù)組在內(nèi)存中的存儲(chǔ)方式,這里以上述定義數(shù)組的第一種方式為例,來進(jìn)行具體說明。第一種數(shù)組定義的方式,相當(dāng)于在內(nèi)存中定義了100個(gè)int類型的變量,第一個(gè)變量的名稱為ids[0],第二個(gè)變量的名稱為ids[1],以此類推,第100個(gè)變量的名稱為ids[99],這些變量的初始值都是0。為了更好地理解數(shù)組的這種定義方式,可以將上面的一句代碼分成兩句來寫,具體如下:
int[] ids; // 聲明一個(gè)int[]類型的變量 ids = new int[100]; // 創(chuàng)建一個(gè)長度為100的數(shù)組,并將數(shù)組地址賦值給數(shù)組類型的變量x
接下來通過兩張內(nèi)存圖來詳細(xì)地說明數(shù)組在創(chuàng)建過程中內(nèi)存的分配情況。
第一行代碼 int[] ids; 聲明了一個(gè)變量ids,該變量的類型為int[],即一個(gè)int類型的數(shù)組。變量ids會(huì)占用一塊內(nèi)存單元,它沒有被分配初始值。此時(shí)ids在內(nèi)存中的狀態(tài)如圖1所示。
圖1 內(nèi)存狀態(tài)圖
第二行代碼 ids = new int[100]; 創(chuàng)建了一個(gè)數(shù)組,并將數(shù)組的內(nèi)存地址賦值給變量ids。在程序運(yùn)行期間可以使用變量ids來引用數(shù)組,這時(shí)內(nèi)存中的狀態(tài)會(huì)發(fā)生變化,如圖2所示。
圖2 內(nèi)存狀態(tài)圖
圖2描述了變量ids引用數(shù)組的情況。該數(shù)組中有100個(gè)元素,初始值都為0。數(shù)組中的每個(gè)元素都有一個(gè)索引(也可稱為角標(biāo)),要想訪問數(shù)組中的元素可以通過“數(shù)組名[角標(biāo)]”的形式,即“ids[0]、…、ids[99]”。需要注意的是,數(shù)組中最小的索引是0,最大的索引是“數(shù)組的長度-1”。在Java中,為了方便獲得數(shù)組的長度,提供了一個(gè)length屬性,在程序中可以通過“數(shù)組名.length”的方式來獲得數(shù)組的長度,即數(shù)組元素的個(gè)數(shù)。
接下來通過一個(gè)完整的案例來演示如何定義數(shù)組以及訪問數(shù)組中的元素,如文件1所示。
文件1 Example18.java
public class Example18 { public static void main(String[] args) { // 1、第一種方式定義數(shù)組 int[] ids = new int[100]; System.out.println("ids[0]="+ids[0]); //訪問數(shù)組第一個(gè)元素 System.out.println("ids[99]="+ids[99]);//訪問數(shù)組最后一個(gè)元素 System.out.println("=============="); // 2、第二種方式定義數(shù)組 String[] names = new String[]{"張三","tom","jack"}; System.out.println("names[0]="+names[0]); //訪問數(shù)組第一個(gè)元素 System.out.println("names[2]="+names[2]); //訪問數(shù)組最后一個(gè)元素 System.out.println("=============="); // 3、第三種方式定義數(shù)組 Object[] object = {"張三","tom","jack"}; System.out.println("數(shù)組的長度為:"+object.length);//獲取數(shù)組的長度 System.out.println("object[0]="+object[0]); //訪問數(shù)組第一個(gè)元素 System.out.println("object[2]="+object[2]); //訪問數(shù)組最后一個(gè)元素 } }
運(yùn)行結(jié)果如圖3所示。
圖3 運(yùn)行結(jié)果
文件1中,分別聲明了一個(gè)int[]類型、String[]類型和Object[]類型的數(shù)組,然后通過“數(shù)組名[角標(biāo)]”的形式獲取了數(shù)組的第一個(gè)和最后一個(gè)元素值,并打印到控制臺(tái)上。從打印結(jié)果可以看出,第一種定義數(shù)組方式定義的int[]類型的數(shù)組中元素的初始值都為0,這是因?yàn)楫?dāng)數(shù)組被成功創(chuàng)建后,數(shù)組中元素會(huì)被自動(dòng)賦予一個(gè)默認(rèn)值,根據(jù)元素類型的不同,默認(rèn)初始化的值也是不一樣的;而第二種和第三種定義數(shù)組方式定義的數(shù)組都指定了初始值,所以打印出對(duì)應(yīng)角標(biāo)的元素值。
Java中不同數(shù)據(jù)類型元素的初始值如表1所示。
表1 Java不同數(shù)據(jù)類型元素的默認(rèn)值
數(shù)據(jù)類型 | 默認(rèn)初始化值 |
---|---|
byte、short、int、long | 0 |
float、double | 0.0 |
char | 一個(gè)空字符,即’\u0000’ |
boolean | false |
引用數(shù)據(jù)類型 | null,表示變量不引用任何對(duì)象 |
在使用數(shù)組時(shí),如果不想使用這些默認(rèn)初始值,可以顯式地為這些元素賦值,當(dāng)然也可以對(duì)定義數(shù)組時(shí)的指定初始值進(jìn)行修改。接下來對(duì)上面的案例進(jìn)行修改來學(xué)習(xí)一下如何為數(shù)組中的元素賦值和修改,如文件2所示。
文件2 Example19.java
public class Example19 { public static void main(String[] args) { // 1、第一種方式定義數(shù)組 int[] ids = new int[100]; System.out.println("ids[0]="+ids[0]); //訪問數(shù)組第一個(gè)元素 // 為數(shù)組指定元素進(jìn)行初始化賦值 ids[0] = 2500; System.out.println("ids[0]="+ids[0]); //再次訪問數(shù)組第一個(gè)元素 System.out.println("=============="); // 2、第二種方式定義數(shù)組 String[] names = new String[]{"張三","tom","jack"}; System.out.println("names[0]="+names[0]); //訪問數(shù)組第一個(gè)元素 // 為數(shù)組定義時(shí)指定的初始值進(jìn)行修改 names[0] = "李四"; System.out.println("names[0]="+names[0]); //再次訪問數(shù)組第一個(gè)元素 System.out.println("=============="); // 3、第三種方式定義數(shù)組 Object[] object = {"張三","tom","jack"}; System.out.println("object[0]="+object[0]); //訪問數(shù)組第一個(gè)元素 // 為數(shù)組定義時(shí)指定的初始值進(jìn)行修改 object[0] = "李四"; System.out.println("object[0]="+object[0]); //再次訪問數(shù)組第一個(gè)元素 } }
運(yùn)行結(jié)果如圖4所示。
圖4 運(yùn)行結(jié)果
文件2中,三種定義數(shù)組的方式都使用了“數(shù)組名[角標(biāo)]=元素值”的形式對(duì)各數(shù)組中指定角標(biāo)的元素進(jìn)行了賦值和修改。從修改的代碼以及程序運(yùn)行結(jié)果可以看出,對(duì)數(shù)組中的元素進(jìn)行賦值或修改操作所使用的方式一樣,只是在使用“數(shù)組名[角標(biāo)]=元素值”的形式對(duì)數(shù)組元素進(jìn)行操作時(shí),如果數(shù)組指定角標(biāo)的元素只有默認(rèn)初始值,那么就是對(duì)元素進(jìn)行的賦值操作;如果數(shù)組指定角標(biāo)的元素已經(jīng)有了初始值,那么就是對(duì)元素進(jìn)行的修改操作。
注意:
1.每個(gè)數(shù)組的索引都有一個(gè)范圍,即0~length-1。在訪問數(shù)組的元素時(shí),索引不能超出這個(gè)范圍,否則程序會(huì)報(bào)錯(cuò),如文件3所示。
文件3 Example20.java
public class Example20 { public static void main(String[] args) { int[] arr = new int[4]; // 定義一個(gè)長度為4的數(shù)組 System.out.println("arr[4]=" + arr[4]); // 通過角標(biāo)4訪問數(shù)組元素 } }
運(yùn)行結(jié)果如圖3所示。
圖5 運(yùn)行結(jié)果
從圖5可以看出,程序運(yùn)行后提示了“ArrayIndexOutOfBoundsException”即數(shù)組角標(biāo)越界異常的錯(cuò)誤。出現(xiàn)這個(gè)異常的原因是數(shù)組的長度為4,其索引范圍為0~3,文件中的第4行代碼使用索引4來訪問元素時(shí)超出了數(shù)組的索引范圍。所謂異常指程序中出現(xiàn)的錯(cuò)誤,它會(huì)報(bào)告出錯(cuò)的異常類型、出錯(cuò)的行號(hào)以及出錯(cuò)的原因,關(guān)于異常內(nèi)容在后面的章節(jié)會(huì)有詳細(xì)地講解。
2.在使用變量引用一個(gè)數(shù)組時(shí),變量必須指向一個(gè)有效的數(shù)組對(duì)象,如果該變量的值為null,則意味著沒有指向任何數(shù)組,此時(shí)通過該變量訪問數(shù)組的元素會(huì)出現(xiàn)空指針異常,接下來通過一個(gè)案例來演示這種異常,如文件4所示。
文件4 Example21.java
public class Example21 { public static void main(String[] args) { int[] arr = new int[3]; // 定義一個(gè)長度為3的數(shù)組 arr[0] = 5; // 為數(shù)組的第一個(gè)元素賦值 System.out.println("arr[0]=" + arr[0]); // 訪問數(shù)組的元素 arr = null; // 將變量arr置為null System.out.println("arr[0]=" + arr[0]); // 再次訪問數(shù)組的元素 } }
運(yùn)行結(jié)果如圖6所示。
圖6 運(yùn)行結(jié)果
從圖6可以看出,文件4中的第4、5行代碼都能通過變量arr正常地操作數(shù)組,而在第6行代碼將變量置為null后,在第7行代碼再次訪問數(shù)組時(shí)就出現(xiàn)了“java.lang.NullPointerException”的異常信息,即空指針異常。
猜你喜歡:
北京校區(qū)