在Java中,數(shù)組必須先初始化,然后才可以使用。所謂的初始化,就是為數(shù)組中的數(shù)組元素分配內存空間,并為每個數(shù)組元素賦初始值。
Java的數(shù)組初始化有兩種基本方式:動態(tài)初始化與靜態(tài)初始化。我們在初始化數(shù)組時,不要靜態(tài)初始化和動態(tài)初始化同時使用。也就是說,不要在進行數(shù)組初始化時,既指定數(shù)組的長度,又為每個數(shù)組元素分配初始值。接下來壹哥分別利用這兩種方式,給大家講解數(shù)組的創(chuàng)建和初始化。
動態(tài)初始化
動態(tài)初始化,是指程序員只指定數(shù)組長度,由系統(tǒng)為數(shù)組元素分配初始值。
1.1 基本語法
數(shù)組在進行動態(tài)初始化時有兩種寫法,大家可以根據(jù)自己的編程習慣進行選擇,沒有孰優(yōu)孰劣。
●寫法1: 數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[長度];
●寫法2: 數(shù)據(jù)類型 數(shù)組名[] = new 數(shù)據(jù)類型[長度];
1.2 案例代碼
public class Demo01 {
public static void main(String[] args) {
//數(shù)組的動態(tài)初始化
//寫法1: new用于創(chuàng)建一個對象
int[] arr = new int[3];
//寫法2
//int arr[] = new int[3];
//存儲數(shù)據(jù)
arr[0] = 11;
arr[1] = 22;
arr[2] = 33;
//取數(shù)據(jù),數(shù)組的下標從0開始
System.out.println("第一個元素為:"+arr[0]);
System.out.println("第二個元素為:"+arr[1]);
System.out.println("第三個元素為:"+arr[2]);
//獲取數(shù)據(jù)的長度
System.out.println("數(shù)組長度="+arr.length);
//錯誤:數(shù)組下標越界
//System.out.println(arr[3]);
}
}
在上述代碼中,new是Java中的關鍵字,用來創(chuàng)建對象,我們以后會詳細學習。
其中new int[3];中的3,表示這個數(shù)組的初始長度是3,只能存放3個數(shù)據(jù)。我們在聲明時在方括號中直接輸入數(shù)組的長度,這種方式就叫做動態(tài)初始化。數(shù)組的長度一旦確定后,就不會再發(fā)生改變。內部的數(shù)據(jù)元素可以通過索引進行添加,arr[]數(shù)組中的數(shù)字就叫做索引。
另外大家還注意,在Java中數(shù)組的下標是從0開始的。所以在一個長度為3的數(shù)組中,最后一個元素的下標為2,則取值時的格式是arr[2],而不應該是arr[3]。否則會產生數(shù)組下標越界異常”ArrayIndexOutOfBoundsException:: Index 3 out of bounds for length 3“,如下圖所示:
靜態(tài)初始化
靜態(tài)初始化,就是由程序員指定每個數(shù)組元素的初始值,由系統(tǒng)計算出數(shù)組的長度。
2.1 基本語法
數(shù)組在進行靜態(tài)初始化時有三種寫法,大家可以根據(jù)自己的編程習慣進行選擇,同樣沒有孰優(yōu)孰劣。簡寫的靜態(tài)初始化,只能在一條語句完成,不能分割成兩條語句。
●寫法1:數(shù)據(jù)類型[] 數(shù)組名 = {數(shù)據(jù)1,數(shù)據(jù)2,...};
●寫法2:數(shù)據(jù)類型 數(shù)組名[] = {數(shù)據(jù)1,數(shù)據(jù)2,...};
●寫法3:數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[]{數(shù)據(jù)1,數(shù)據(jù)2,...};
2.2 案例代碼
public class Demo02 {
public static void main(String[] args) {
//數(shù)組的靜態(tài)初始化
//寫法1
//引用類型的數(shù)組。聲明數(shù)組后直接添加一個花括號{},并在花括號中添加數(shù)據(jù),就是靜態(tài)初始化
String[] names = {"張三","李四","王五","一一哥"};
//寫法2:
//String names[] = {"張三","李四","王五","一一哥"};
//寫法3:
//String names[] = new String[]{"張三","李四","王五","一一哥"};
// [Ljava.lang.String;@15db9742 內存地址
// System.out.println(names);
//操作數(shù)組
//存數(shù)據(jù),新數(shù)據(jù)存入到原有的位置
names[0] = "yyg";
names[1] = "尼古拉斯";
//取數(shù)據(jù)
System.out.println("第二個元素:"+names[1]);
System.out.println("第四個元素:"+names[3]);
//獲取數(shù)組的長度
System.out.println("數(shù)組的長度:"+names.length);
}
}
在上述代碼中,在聲明完數(shù)組后,直接添加一個花括號{},并在花括號中添加數(shù)據(jù),這種方式就叫做靜態(tài)初始化。
對于初始化問題,有這樣的一個問題哈!大家可以看看:
java中為什么數(shù)組靜態(tài)初始化可以省略new而動態(tài)初始化不行?
其實在Java中,數(shù)組的初始化有兩種方式:靜態(tài)初始化和動態(tài)初始化。
靜態(tài)初始化是指在定義數(shù)組的同時為數(shù)組元素指定初始值,可以省略new操作符。例如:
int[] arr1 = {1, 2, 3};
動態(tài)初始化是指在定義數(shù)組后,通過new操作符為數(shù)組元素分配空間,并指定初始值。例如:
int[] arr2 = new int[3];
arr2[0] = 1;
arr2[1] = 2;
arr2[2] = 3;
數(shù)組靜態(tài)初始化可以省略new操作符的原因是編譯器可以根據(jù)初始化的元素數(shù)量自動確定數(shù)組的長度,并分配相應的內存空間。而動態(tài)初始化必須顯式指定數(shù)組長度,因為編譯器無法根據(jù)賦值語句推斷數(shù)組的長度。
因此,對于動態(tài)初始化,必須先使用new操作符為數(shù)組分配內存空間,然后再為數(shù)組元素賦值。現(xiàn)在大家明白了嗎?