一.數(shù)組概念
(一)數(shù)組的概念:
數(shù)組就是存儲(chǔ)數(shù)據(jù)長(zhǎng)度固定的容器邦蜜,保證多個(gè)數(shù)據(jù)的數(shù)據(jù)類型要一致
(二)數(shù)組的特點(diǎn):
- 數(shù)組是一種引用數(shù)據(jù)類型
- 數(shù)組當(dāng)中的多個(gè)數(shù)據(jù)恰力,類型必須統(tǒng)一
- 數(shù)組的長(zhǎng)度在程序運(yùn)行期間不可改變
二.數(shù)組的定義
在內(nèi)存當(dāng)中創(chuàng)建一一個(gè)數(shù)組割按, 并且向其中賦予一些默認(rèn)值私蕾。
(一)兩種常見(jiàn)的初始化方式:
1.動(dòng)態(tài)初始化(指定長(zhǎng)度)
(1)格式:數(shù)據(jù)類型[] 數(shù)組名稱 = new 數(shù)據(jù)類型[數(shù)組長(zhǎng)度];
例:int[] arrayA = new int[3];
(2)數(shù)組定義格式詳解:
- 左側(cè)數(shù)據(jù)類型:創(chuàng)建的數(shù)組容器可以存儲(chǔ)什么數(shù)據(jù)類型伍绳。
- 左側(cè)[]:表示數(shù)組虏等。
- 左側(cè)數(shù)組名稱 :為定義的數(shù)組起個(gè)變量名,滿足標(biāo)識(shí)符規(guī)范,可以使用名稱操作數(shù)組啡专。
- 右側(cè)new:關(guān)鍵字,創(chuàng)建數(shù)組使用的關(guān)鍵字险毁。
- 右側(cè)數(shù)據(jù)類型:創(chuàng)建的數(shù)組容器可以存儲(chǔ)什么數(shù)據(jù)類型,必須與左邊相一致
- 右側(cè)[數(shù)組長(zhǎng)度]:數(shù)組的長(zhǎng)度,表示數(shù)組容器中可以存儲(chǔ)多少個(gè)元素们童。
注意:數(shù)組有定長(zhǎng)特性畔况,長(zhǎng)度一旦指定,不可更改病附。
2.靜態(tài)初始化(指定內(nèi)容)
(1)標(biāo)準(zhǔn)格式:
數(shù)據(jù)類型[] 數(shù)組名稱 = new 數(shù)據(jù)類型[] {元素1,元素2,... };
例:int[] arrayB = new int[]{1, 2, 3};
(2)省略格式:
數(shù)據(jù)類型[] 數(shù)組名稱 = {元素1,元素2亥鬓,... };
例:int[] arrayC = {1, 2, 3};
(二)注意事項(xiàng):
- 靜態(tài)初始化沒(méi)有直接指定長(zhǎng)度完沪,但是仍然會(huì)自動(dòng)推算得到長(zhǎng)度。
- 靜態(tài)初始化標(biāo)準(zhǔn)格式可以拆分成為兩個(gè)步驟嵌戈。
- 動(dòng)態(tài)初始化也可以拆分成為兩個(gè)步驟覆积。
- 靜態(tài)初始化一旦使用省略格式, 就不能拆分成為兩個(gè)步驟了熟呛。|
代碼:
public class Array {
public static void main(String[] args) {
int[] arrayA = new int[3];
// 拆分成兩個(gè)步驟
int[] arrayA1;
arrayA1 = new int[3];
int[] arrayB = new int[]{1, 2, 3};
//拆分成兩個(gè)步驟
int[] arrayB1;
arrayB1 = new int[]{1, 2, 3};
int[] arrayC = {1, 2, 3};
}
}
三.數(shù)組的訪問(wèn)
(一)索引:
每一個(gè)存儲(chǔ)到數(shù)組的元素宽档,都會(huì)自動(dòng)的擁有一個(gè)編號(hào),從0開(kāi)始庵朝,這個(gè)自動(dòng)編號(hào)稱為數(shù)組索引(index)吗冤,可以通過(guò)數(shù)組的索引訪問(wèn)到數(shù)組中的元素。
(二)訪問(wèn)數(shù)組元素:
1.格式
數(shù)組名稱[索引值]
2.索引值
就是一個(gè)int數(shù)字九府, 代表數(shù)組當(dāng)中元素的編號(hào)椎瘟。
索引值從0開(kāi)始,一直到數(shù)組的長(zhǎng)度-1為止侄旬。
3.索引訪問(wèn)數(shù)組中的元素
(1)變量=數(shù)組名[索引]
肺蔚,獲取出數(shù)組中的元素
代碼:
public class Array {
public static void main(String[] args) {
// 靜態(tài)初始化的標(biāo)準(zhǔn)格式
String[] array = new String[]{"Hello", "World", "!"};
System.out.println(array);
// 直接打印數(shù)組當(dāng)中的元素
System.out.print(array[0]); // Hello
System.out.print(array[1]); // World
System.out.println(array[2]); // !
// 也可以將數(shù)組當(dāng)中的某一個(gè)單個(gè)元素,賦值交給變量
String str = array[1];
System.out.println("數(shù)組當(dāng)中第1號(hào)元素是:"+str); // World
}
}
運(yùn)行結(jié)果:
使用動(dòng)態(tài)初始化數(shù)組的時(shí)候,其中的元素將會(huì)自動(dòng)擁有一一個(gè)默認(rèn)值儡羔。規(guī)則如下:
數(shù)據(jù)類型 默認(rèn)值
基本類型 整數(shù)(byte宣羊,short,int汰蜘,long) 0
浮點(diǎn)數(shù)(float仇冯,double) 0.0
字符(char) '\u0000'
布爾(boolean) false
引用類型 數(shù)組,類族操,接口 null
注意事項(xiàng):
靜態(tài)初始化其實(shí)也有默認(rèn)值的過(guò)程赞枕,只不過(guò)系統(tǒng)自動(dòng)馬上將默認(rèn)值替換成為了大括號(hào)當(dāng)中的具體數(shù)值。
代碼:
public class Array {
public static void main(String[] args) {
// 靜態(tài)初始化的標(biāo)準(zhǔn)格式
String[] array = new String[3];
System.out.println(array); // 內(nèi)存地址值
System.out.println(array[0]); // null
System.out.println(array[1]); // null
System.out.println(array[2]); // null
}
}
運(yùn)行結(jié)果:
(2)數(shù)組名[索引]=數(shù)值
,為數(shù)組中的元素賦值
代碼:
public class Array {
public static void main(String[] args) {
// 靜態(tài)初始化的標(biāo)準(zhǔn)格式
String[] array = new String[3];
System.out.println(array); // 內(nèi)存地址值
System.out.println(array[0]); // null
System.out.println(array[1]); // null
System.out.println(array[2]); // null
System.out.println("===================");
// 將數(shù)據(jù)World賦值交給數(shù)組array
array[1] = "World";
System.out.println(array[0]); // null
System.out.println(array[1]); // World
System.out.println(array[2]); // null
}
}
運(yùn)行結(jié)果:
四.數(shù)組的內(nèi)存圖
(一)一個(gè)數(shù)組的內(nèi)存圖
代碼:
public class ArrayOne {
public static void main(String[] args) {
int[] array = new int[3]; // 動(dòng)態(tài)初始化
System.out.println(array); // 地址值
System.out.println(array[0]); // 0
System.out.println(array[1]); // 0
System.out.println(array[2]); // 0
// 改變數(shù)組當(dāng)中元素的內(nèi)容
array[1] = 10;
array[2] = 20;
System.out.println(array); // 地址值
System.out.println(array[0]); // 0
System.out.println(array[1]); // 10
System.out.println(array[2]); // 20
}
}
運(yùn)行結(jié)果:
內(nèi)存圖
(二)兩個(gè)獨(dú)立數(shù)組的內(nèi)存圖
代碼:
public class ArrayTwo {
public static void main(String[] args) {
int[] arrayA = new int[3]; // 動(dòng)態(tài)初始化
System.out.println(arrayA); // 地址值
System.out.println(arrayA[0]); // 0
System.out.println(arrayA[1]); // 0
System.out.println(arrayA[2]); // 0
System.out.println("===============");
// 改變數(shù)組當(dāng)中元素的內(nèi)容
arrayA[1] = 10;
arrayA[2] = 20;
System.out.println(arrayA); // 地址值
System.out.println(arrayA[0]); // 0
System.out.println(arrayA[1]); // 10
System.out.println(arrayA[2]); // 20
System.out.println("===============");
int[] arrayB = new int[3]; // 動(dòng)態(tài)初始化
System.out.println(arrayB); // 地址值
System.out.println(arrayB[0]); // 0
System.out.println(arrayB[1]); // 0
System.out.println(arrayB[2]); // 0
System.out.println("===============");
// 改變數(shù)組當(dāng)中元素的內(nèi)容
arrayB[1] = 100;
arrayB[2] = 200;
System.out.println(arrayB); // 地址值
System.out.println(arrayB[0]); // 0
System.out.println(arrayB[1]); // 100
System.out.println(arrayB[2]); // 200
}
}
運(yùn)行結(jié)果:
內(nèi)存圖
(三)兩個(gè)引用指向同一個(gè)數(shù)組的內(nèi)存圖
代碼:
public class ArraySame {
public static void main(String[] args) {
int[] arrayA = new int[3]; // 動(dòng)態(tài)初始化
System.out.println(arrayA); // 地址值
System.out.println(arrayA[0]); // 0
System.out.println(arrayA[1]); // 0
System.out.println(arrayA[2]); // 0
System.out.println("===============");
// 改變數(shù)組當(dāng)中元素的內(nèi)容
arrayA[1] = 10;
arrayA[2] = 20;
System.out.println(arrayA); // 地址值
System.out.println(arrayA[0]); // 0
System.out.println(arrayA[1]); // 10
System.out.println(arrayA[2]); // 20
System.out.println("===============");
int[] arrayB = arrayA; // 動(dòng)態(tài)初始化
System.out.println(arrayB); // 地址值
System.out.println(arrayB[0]); // 0
System.out.println(arrayB[1]); // 10
System.out.println(arrayB[2]); // 20
System.out.println("===============");
// 改變數(shù)組當(dāng)中元素的內(nèi)容
arrayB[1] = 100;
arrayB[2] = 200;
System.out.println(arrayB); // 地址值
System.out.println(arrayA[0]); // 0
System.out.println(arrayB[0]); // 0
System.out.println(arrayA[1]); // 100
System.out.println(arrayB[1]); // 100
System.out.println(arrayA[2]); // 200
System.out.println(arrayB[2]); // 200
}
}
運(yùn)行結(jié)果:
內(nèi)存圖
五.數(shù)組的常見(jiàn)異常
(一)數(shù)組索引越界異常
數(shù)組的索引編號(hào)從0開(kāi)始炕婶,一直到“數(shù)組的長(zhǎng)度- 1”為止姐赡。如果訪問(wèn)數(shù)組元素的時(shí)候,索引編號(hào)并不存在柠掂,那么將會(huì)發(fā)生數(shù)組索引越界異常ArrayIndexOutOfBoundsException
代碼:
public class ArrayIndex {
public static void main(String[] args) {
int[] array = {15, 25, 35};
System.out.println(array[0]); // 15
System.out.println(array[1]); // 25
System.out.println(array[2]); // 35
//錯(cuò)誤寫(xiě)法
//并不存在三號(hào)元素,所以發(fā)生異常
System.out.println(array[3]);
}
}
運(yùn)行結(jié)果:
(二)空指針異常
所有的引用類型變量项滑,都可以賦值為一個(gè)null值。但是代表其中什么都沒(méi)有涯贞。數(shù)組必須進(jìn)行new初始化才能使用其中的元素枪狂。如果只是賦值了一個(gè)null,沒(méi)有進(jìn)行new創(chuàng)建宋渔,那么將會(huì)發(fā)生:空指針異常NullPointerException
代碼:
public class ArrayNull {
public static void main(String[] args) {
int[] array= null;
System.out.println(array[0]);
}
}
運(yùn)行結(jié)果:
五.數(shù)組的遍歷
(一).數(shù)組的長(zhǎng)度
數(shù)組的長(zhǎng)度屬性: 每個(gè)數(shù)組都具有長(zhǎng)度州疾,而且是固定的,Java中賦予了數(shù)組的一個(gè)屬性皇拣,可以獲取到數(shù)組的長(zhǎng)度严蓖,
語(yǔ)句為:數(shù)組名.length
,屬性length的執(zhí)行結(jié)果是數(shù)組的長(zhǎng)度氧急,int類型結(jié)果颗胡。由次可以推斷出,數(shù)組的最大索引值為數(shù)組名.length-1
吩坝。
代碼:
public class Array {
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4, 5};
//打印數(shù)組的屬性毒姨,輸出結(jié)果是5
System.out.println("數(shù)組的長(zhǎng)度是:" + arr.length);
}
}
運(yùn)行結(jié)果:
注意事項(xiàng):數(shù)組一旦創(chuàng)建,程序運(yùn)行期間钉寝,長(zhǎng)度不可改變弧呐。
代碼:
public class ArrayLength {
public static void main(String[] args) {
int[] arrayC = new int[3];
System.out.println(arrayC);
System.out.println(arrayC.length);
System.out.println("=================");
arrayC = new int[5];
System.out.println(arrayC);
System.out.println(arrayC.length);
}
}
運(yùn)行結(jié)果:
解釋:數(shù)組是在堆中存放,長(zhǎng)度不能發(fā)生改變。重新new是新建了一個(gè)數(shù)組,并用arrayC指向了新的數(shù)組嵌纲。
(二).遍歷數(shù)組
數(shù)組遍歷: 就是將數(shù)組中的每個(gè)元素分別獲取出來(lái)泉懦。遍歷也是數(shù)組操作中的基石。
代碼:
public class Array {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5, 6};
// 正序遍歷數(shù)組
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]);
}
System.out.println();
// 正序遍歷數(shù)組省略格式
for (int value : array) {
System.out.print(value);
}
System.out.println();
// 倒序遍歷數(shù)組
for (int i = array.length - 1; i >= 0; i--) {
System.out.print(array[i]);
}
}
}
運(yùn)行結(jié)果:
六.數(shù)組作為方法參數(shù)和返回值
(一)數(shù)組作為方法參數(shù)
數(shù)組可以作為方法的參數(shù)疹瘦。當(dāng)調(diào)用方法的時(shí)候崩哩,向方法的小括號(hào)進(jìn)行傳參,傳遞進(jìn)去的其實(shí)是數(shù)組的地址值言沐。
- 數(shù)組作為方法參數(shù)傳遞邓嘹,傳遞的參數(shù)是數(shù)組的內(nèi)存地址。
代碼:
public class ArrayParam {
public static void main(String[] args) {
int[] array = {10, 20, 30, 40, 50};
System.out.println(array);
printArray(array);
System.out.println("======AAA======");
printArray(array);
System.out.println("======BBB======");
printArray(array);
}
public static void printArray(int[] array) {
System.out.println("printArray方法收到的參數(shù)是:" + array);
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
運(yùn)行結(jié)果:
(二) 數(shù)組作為方法返回值
數(shù)組可以作為方法的返回值险胰。當(dāng)調(diào)用方法的時(shí)候汹押,使用return語(yǔ)句返回?cái)?shù)組,返回的其實(shí)是數(shù)組的地址值起便。
- 數(shù)組作為方法的返回值棚贾,返回的是數(shù)組的內(nèi)存地址
代碼
public class ArrayReturn {
public static void main(String[] args) {
int[] result = calculate(10, 20, 30);
System.out.println("main方法接收到的返回值數(shù)組是:" + result); // 地址值
System.out.println("總和:" + result[0]);
System.out.println("平均數(shù)" + result[1]);
}
public static int[] calculate(int a, int b, int c) {
int sum = a + b + c;
int avg = sum / 3;
int[] array = {sum, avg};
System.out.println("calculcate方法內(nèi)部數(shù)組是:" + array); // 地址值
return array;
}
}
運(yùn)行結(jié)果:
注意事項(xiàng):
- 任何數(shù)據(jù)類型都能作為方法的參數(shù)類型窖维,或者返回值類型。
- 數(shù)組作為方法的參數(shù)妙痹,傳遞進(jìn)去的其實(shí)是數(shù)組的地址值铸史。
- 數(shù)組作為方法的返回值,返回的其實(shí)也是數(shù)組的地址值.