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