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