Java 數(shù)組
數(shù)組在編程語(yǔ)言中是非常重要的數(shù)據(jù)結(jié)構(gòu)。本小節(jié)我們來(lái)一起學(xué)習(xí) Java 數(shù)組,通過(guò)本小節(jié)的學(xué)習(xí),你將了解到數(shù)組的基本概念,如何聲明數(shù)組以及數(shù)組的聲明有哪些方式,如何初始化數(shù)組以及數(shù)組初始化有哪些方式,數(shù)組的常用操作有哪些,多維數(shù)組的聲明、創(chuàng)建、初始化以及迭代等等。多維數(shù)組部分將以二維數(shù)組進(jìn)行為例講解,理解了二維數(shù)組,再去理解多維數(shù)組就相對(duì)容易了。
1. 什么是數(shù)組
數(shù)組是相同類型的數(shù)據(jù)按照順序組成的一種引用數(shù)據(jù)類型。
Java 中有基本數(shù)據(jù)類型和引用數(shù)據(jù)類型兩種數(shù)據(jù)類型。數(shù)組就是引用數(shù)據(jù)類型。
2. 數(shù)組聲明
在Java語(yǔ)言中,數(shù)組聲明有兩種語(yǔ)法:
-
中括號(hào)跟在數(shù)據(jù)類型后:
DataType[] arrayName;
-
中括號(hào)跟在數(shù)組名稱后:
DataType arrayName[];
其中DataType
是數(shù)組中要存放元素的數(shù)據(jù)類型,例如int
、String
等,arrayName
是數(shù)組名稱,遵守變量的命名規(guī)范。
在實(shí)際的編碼中,我們更常用的是第一種語(yǔ)法。實(shí)例如下:
// 聲明一個(gè)int類型的數(shù)組,名稱為 firstIntArray:
int[] firstIntArray; // 推薦寫法
int firstIntArray[];
也可以修改數(shù)據(jù)類型,以生成其他類型的數(shù)組。實(shí)例如下:
// 聲明一個(gè)float類型的數(shù)組:
float[] firstFloatArray;
// 聲明一個(gè)字符串類型的數(shù)組:
String[] firstStringArray;
3. 數(shù)組創(chuàng)建
3.1 先聲明再創(chuàng)建
先聲明再創(chuàng)建,需要編寫兩條語(yǔ)句:
DataType[] arrayName;
arrayName = new DataType[數(shù)組長(zhǎng)度];
數(shù)組的創(chuàng)建使用new
關(guān)鍵字,后面跟上一個(gè)空格+數(shù)據(jù)類型+中括號(hào)[]
,中括號(hào)中間是數(shù)組的長(zhǎng)度,這里是必須指定的,它是一個(gè)整型的數(shù)字。實(shí)例如下:
// 聲明一個(gè)整型的數(shù)組:
int[] intArray;
// 創(chuàng)建數(shù)組,長(zhǎng)度為10
intArray = new int[10];
3.2 聲明時(shí)同時(shí)創(chuàng)建
聲明時(shí)同時(shí)創(chuàng)建,需要編寫一條語(yǔ)句:
DataType[] arrayName = new DataType[數(shù)組長(zhǎng)度];
實(shí)例如下:
// 聲明時(shí)同時(shí)創(chuàng)建
int[] intArray = new int[10];
數(shù)組聲明用到的中括號(hào),也可以放到數(shù)組名稱的后面,實(shí)例如下:
int intArray[] = new int[10];
所創(chuàng)建的數(shù)組數(shù)據(jù)類型必須與其聲明的數(shù)據(jù)類型相同。對(duì)于其他類型數(shù)組的創(chuàng)建,實(shí)例如下:
// 創(chuàng)建一個(gè)數(shù)據(jù)類型為字符串、長(zhǎng)度為5的數(shù)組:
String[] stringArray = new String[5];
// 創(chuàng)建一個(gè)數(shù)據(jù)類型為雙精度浮點(diǎn)型、長(zhǎng)度為10的數(shù)組:
double[] floatArray = new double[10];
// 創(chuàng)建一個(gè)數(shù)據(jù)類型為字符型、長(zhǎng)度為10的數(shù)組:
char[] charArray;
charArray = new char[10];
4. 數(shù)組初始化
數(shù)組創(chuàng)建后,所有元素都初始化為默認(rèn)值,整型數(shù)組的元素都為 0,浮點(diǎn)型都為 0. 0 ,布爾型都為 false
。例如 int[] arr = new int[5];
語(yǔ)句創(chuàng)建了一個(gè)數(shù)組,它在結(jié)構(gòu)可參考下圖:

除了數(shù)組的默認(rèn)初始化,還有另外兩種常見形式:
- 靜態(tài)初始化
- 動(dòng)態(tài)初始化
下面我們將分別介紹兩種數(shù)組的初始化形式。
4.1 靜態(tài)初始化
靜態(tài)初始化數(shù)組,就是聲明的同時(shí),給數(shù)組賦值。其語(yǔ)法為:
DataType[] arrayName = {元素1, 元素2, 元素3, 元素n};
賦值符號(hào)右邊為用中括號(hào)所包圍的 n 個(gè)元素,實(shí)例如下:
int[] arr = {1, 2, 3, 4, 5};
上面數(shù)組arr
存放的元素為從 1 到 5 這幾個(gè)整型。其的長(zhǎng)度為 5 。 數(shù)組的長(zhǎng)度就是初始化時(shí)所給數(shù)組元素的個(gè)數(shù)。
4.2 動(dòng)態(tài)初始化
動(dòng)態(tài)初始化數(shù)組,即數(shù)組的聲明以及創(chuàng)建是與數(shù)組的賦值操作分開進(jìn)行的。實(shí)例如下:
// 聲明并創(chuàng)建數(shù)組,長(zhǎng)度為3
int[] arr = new int[3];
// 給下標(biāo)位置0賦值為1
arr[0] = 1;
// 給下標(biāo)位置1賦值為2
arr[1] = 2;
// 給下標(biāo)位置2賦值為3
arr[2] = 3;
數(shù)組是有下標(biāo)的,下標(biāo)從0開始,因此長(zhǎng)度為 3 的數(shù)組,最大下標(biāo)為 2 。下圖展示了上述代碼的執(zhí)行流程:

5. 數(shù)組的操作
5.1 數(shù)組元素的引用
語(yǔ)法:數(shù)組名[下標(biāo)],下標(biāo)從0
開始。有一個(gè)整型數(shù)組,引用其第一個(gè)元素,實(shí)例如下:
public class ArrayDemo {
public static void main(String[] args) {
// 初始化整型數(shù)組arr:
int[] arr = {1, 2, 3};
// 引用arr的第一個(gè)元素:
int element1 = arr[0];
System.out.println("數(shù)組arr中,第一個(gè)元素為:" + element1);
}
}
運(yùn)行結(jié)果:
數(shù)組arr中,第一個(gè)元素為:1
注意,上面的數(shù)組下標(biāo)最大為 2,也就是說(shuō),引用元素時(shí),不能超過(guò)其下標(biāo)最大值。下面是一個(gè)反例:
public class OutOfIndexDemo {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
// 引用arr的第四個(gè)元素:
int element4 = arr[3];
}
}
由于數(shù)組中只有三個(gè)元素,但引用了索引為3的第四個(gè)元素,編譯執(zhí)行代碼,會(huì)拋出如下異常:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at OutOfIndexDemo.main(OutOfIndexDemo.java:5)
5.2 數(shù)組元素的修改
既然可以引用數(shù)組元素,就可以修改元素,實(shí)例如下:
public class ArrayDemo1 {
public static void main(String[] args) {
// 初始化整型數(shù)組arr:
int [] arr = {1, 2, 3};
// 修改下標(biāo)為1的元素為4
arr[1] = 4;
System.out.println("數(shù)組arr中,第二個(gè)元素為:" + arr[1]);
}
}
運(yùn)行結(jié)果:
數(shù)組arr中,第二個(gè)元素為:4
5.3 獲取數(shù)組長(zhǎng)度
我們可以使用數(shù)組的內(nèi)置屬性length
來(lái)獲取數(shù)組的長(zhǎng)度,使用點(diǎn)操作符調(diào)用其內(nèi)置屬性:arrayName.length
。實(shí)例如下:
public class ArrayDemo2 {
public static void main(String[] args) {
// 初始化整型數(shù)組arr:
int[] arr = {1, 2, 3};
// 打印數(shù)組arr的長(zhǎng)度:
System.out.println("數(shù)組arr的長(zhǎng)度為:" + arr.length);
}
}
數(shù)組arr的長(zhǎng)度為:3
有時(shí)我們想引用數(shù)組中最后一個(gè)元素,由于數(shù)組下標(biāo)從0開始,所以最后一個(gè)元素的下標(biāo)為數(shù)組的長(zhǎng)度減去1,這時(shí)可以結(jié)合length
屬性來(lái)進(jìn)行引用。實(shí)例如下:
public class ArrayDemo3 {
public static void main(String[] args) {
// 初始化一個(gè)char類型的數(shù)組:
char[] charArr = {'I', 'm', 'o', 'o', 'c'};
// 引用最后一個(gè)元素:
char lastElement = charArr[charArr.length-1];
System.out.println("charArr數(shù)組的最后一個(gè)元素為:" + lastElement);
}
}
charArr數(shù)組的最后一個(gè)元素為:c
5.4 數(shù)組的迭代
5.4.1 循環(huán)賦值
我們知道了數(shù)組如何賦值,在實(shí)際的編碼中,對(duì)整型數(shù)組循環(huán)賦值是很常用的。
實(shí)例:
運(yùn)行結(jié)果:
public class ArrayDemo4 {
public static void main(String[] args) {
// 聲明一個(gè)整型數(shù)組
int[] arr = new int[10];
// 使用for循環(huán)對(duì)數(shù)組arr進(jìn)行遍歷,將數(shù)字1到10賦值給數(shù)組arr
for (int i = 0; i < arr.length; i++) {
arr[i] = i + 1;
}
// 循環(huán)賦值完成,此時(shí) arr = {1,2,3,4,5,6,7,8,9,10}
// 遍歷數(shù)組,打印數(shù)組中每一個(gè)元素
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
}
}
1 2 3 4 5 6 7 8 9 10
5.4.2 循環(huán)引用
我們可以使用循環(huán)引用依次打印數(shù)組中的每個(gè)元素。
實(shí)例如下:
public class ArrayDemo5 {
public static void main(String[] args) {
// 初始化一個(gè)整型數(shù)組
int[] arr = {1,2,3,4,5};
// 使用for循環(huán)遍歷數(shù)組arr
for (int i = 0; i < arr.length; i++) {
// 打印位置i的元素
System.out.println("索引位置" + i + "的元素為:" + arr[i]);
}
}
}
運(yùn)行結(jié)果:
索引位置0的元素為:1
索引位置1的元素為:2
索引位置2的元素為:3
索引位置3的元素為:4
索引位置4的元素為:5
5.4.3 增強(qiáng) for 循環(huán)
上一小節(jié)我們提到for each
循環(huán)可以更簡(jiǎn)單地對(duì)數(shù)組進(jìn)行迭代。以下是for each
循環(huán)的語(yǔ)法結(jié)構(gòu):
for(變量聲明: 數(shù)組或列表) {
// 循環(huán)體
}
我們來(lái)看一個(gè)實(shí)例:
public class ForEachLoop {
public static void main(String[] args) {
// 初始化字符串?dāng)?shù)組 words
String[] words = {"Welcome ", "to ", "imooc"};
for(String word: words) {
System.out.print(word);
}
}
}
運(yùn)行結(jié)果:
Welcome to imooc
實(shí)例中遍歷了一個(gè)單詞數(shù)組,并且將它們打印成了一個(gè)句子。for each
循環(huán)對(duì)words
數(shù)組進(jìn)行了遍歷,并依次將每個(gè)索引的值賦值給了word
變量,然后再執(zhí)行循環(huán)體中的語(yǔ)句。顯然 for each
循環(huán)的代碼看起來(lái)更加清晰。但增強(qiáng)for
循環(huán)無(wú)法指定遍歷順序,也無(wú)法獲取數(shù)組的索引。
5.4.4 更多實(shí)例
對(duì)于數(shù)組的循環(huán)還有很多案例,下面我們一起來(lái)學(xué)習(xí)幾個(gè)。
實(shí)例1,求整型數(shù)組中,偶數(shù)元素的累加和:
public class ArraySumDemo {
public static void main(String[] args) {
// 初始化變量sum,用于存放累加和
int sum = 0;
// 創(chuàng)建一個(gè)包含100個(gè)元素的整型數(shù)組
int[] arr = new int[100];
// 對(duì)arr進(jìn)行循環(huán)賦值,將整數(shù)1~100賦值到數(shù)組中
for(int i = 0; i < arr.length; i++) {
arr[i] = i + 1;
}
// 遍歷賦值好的數(shù)組
for(int i = 0; i < arr.length; i++) {
if(arr[i] % 2 == 0) {
// 如果當(dāng)前元素對(duì)二取余等于0,則為偶數(shù),執(zhí)行累加計(jì)算
sum += arr[i];
}
}
// 數(shù)組循環(huán)計(jì)算結(jié)束,輸出最終結(jié)果
System.out.println("數(shù)組arr中偶數(shù)元素的累加和為:" + sum);
}
}
運(yùn)行結(jié)果:
數(shù)組arr中偶數(shù)元素的累加和為:2550
實(shí)例2,求數(shù)組中最大值:
public class ArrayGetMaxDemo {
public static void main(String[] args) {
int[] arr = {20, 30, 15, 70, 92, 11};
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
System.out.println("最大值為:" + max);
}
}
運(yùn)行結(jié)果:
最大值為:92
實(shí)例3,使用for each
循環(huán)遍歷整型數(shù)組,獲取數(shù)組中的最小值:
public class ArrayGetMinDemo {
public static void main(String[] args) {
int[] arr = {20, 30, 15, 70, 92, 11};
int min = arr[0];
for(int n: arr) {
if(n < min) {
min = n;
}
}
System.out.println("最小值為:" + min);
}
}
運(yùn)行結(jié)果:
最小值為:11
6. 多維數(shù)組
在Java中,多維數(shù)組也是非常常用的數(shù)據(jù)結(jié)構(gòu),下面以二維數(shù)組為例,介紹二維數(shù)組的聲明、創(chuàng)建、初始化和引用。
6.1 聲明
二維數(shù)組有 3 種聲明方式:
- 中括號(hào)跟在數(shù)據(jù)類型后:
DataType[][] arrayName;
(最推薦寫法) - 中括號(hào)跟在數(shù)組名后:
DataType arrayName[][];
- 中括號(hào)一個(gè)在前,一個(gè)在后:
DataType[] arranName[];
實(shí)例:
// 聲明一個(gè)整型的二維數(shù)組
int[][] intArray;
// 聲明一個(gè)單精度浮點(diǎn)型的二維數(shù)組
float floatArray[][];
// 聲明一個(gè)char類型的二維數(shù)組
char[] charArray[];
6.2創(chuàng)建
二維數(shù)組可以想象成一個(gè)存放數(shù)據(jù)的表格,二維數(shù)組的創(chuàng)建和一維數(shù)組相似??梢月暶鲾?shù)組的同時(shí)創(chuàng)建:
javaDataType[][] arrayName = new int[行數(shù)][列數(shù)];
也可以先聲明再創(chuàng)建:
DataType[][] arrayName;
arrayName = new DataType[行數(shù)][列數(shù)];
實(shí)例:
// 聲明并創(chuàng)建一個(gè)2行3列的數(shù)組
int[][] intArray = new int[2][3];
// 聲明一個(gè)單精度浮點(diǎn)型的二維數(shù)組
float floatArray[][];
// 創(chuàng)建一個(gè)3行3列的二維數(shù)組
floatArray = new float[3][3];
在創(chuàng)建數(shù)組的時(shí)候,我們也可以先不指定列的數(shù)量,再在后面進(jìn)行逐行創(chuàng)建。
實(shí)例:
// 創(chuàng)建一個(gè)3行的二維數(shù)組
int intArray[][] = new int[3][];
// 第一行3列
intArray[0] = new int[3];
// 第二行2列
intArray[1] = new int[2];
// 第三行1列
intArray[2] = new int[1];
6.3 初始化
多維數(shù)組也有靜態(tài)初始化和動(dòng)態(tài)初始化之分,對(duì)于靜態(tài)初始化,一維數(shù)組使用一對(duì)大括號(hào){}
包含其元素,而二維數(shù)組的初始化可以使用兩對(duì)大括號(hào)包含行數(shù)和列數(shù)。實(shí)例如下:
// 創(chuàng)建一個(gè)3行2列的二維數(shù)組
int[][] intArray = {{1,2}, {3,4}, {5,6}};
動(dòng)態(tài)初始化實(shí)例如下:
// 聲明并創(chuàng)建一個(gè)數(shù)組
int intArray[][] = new int[2][3];
// 為第1行第1列的元素賦值:
intArray[0][0] = 10;
Tips:為數(shù)組賦值時(shí),要注意數(shù)組的下標(biāo)索引是從0開始的。
一維數(shù)組可以通過(guò)length
屬性獲取元素個(gè)數(shù),同樣二維數(shù)組的行數(shù)和列數(shù)也可以使用length
屬性獲取。實(shí)例如下:
public class ArrayDemo6 {
public static void main(String[] args) {
// 初始化一個(gè)3行2列的二維數(shù)組
int[][] intArray = {{1,2,7}, {3,4}, {5,6}};
// 獲取intArray的行數(shù)
System.out.println("intArray的行數(shù)為:" + intArray.length);
// 獲取intArray第1行的列數(shù)
System.out.println("intArray第一行的列數(shù)為:" + intArray[0].length);
}
}
運(yùn)行結(jié)果:
intArray的行數(shù)為:3
intArray第一行的列數(shù)為:3
6.4 二維數(shù)組的迭代
一維數(shù)組使用單層for
循環(huán)就可以遍歷,二維數(shù)組的遍歷需要使用雙層嵌套for
循環(huán)。
實(shí)例:
public class ArrayDemo7 {
public static void main(String[] args) {
// 初始化一個(gè)3行2列的二維數(shù)組
int[][] intArray = {{1,2,7}, {3,4}, {5,6}};
// 遍歷intArray
for(int i = 0; i < intArray.length; i++) {
for(int j = 0; j <intArray[i].length; j++) {
// 打印索引位置[i][j]的元素:
System.out.println((i+1) + "行" + (j+1) + "列的元素為:" + intArray[i][j]);
}
// 打印一個(gè)空行
System.out.println();
}
}
}
運(yùn)行結(jié)果:
1行1列的元素為:1
1行2列的元素為:2
1行3列的元素為:7
2行1列的元素為:3
2行2列的元素為:4
3行1列的元素為:5
3行2列的元素為:6
7. 小結(jié)
本小節(jié)我們學(xué)習(xí)了 Java 數(shù)組,知道了數(shù)組是引用數(shù)據(jù)類型。它在創(chuàng)建時(shí),會(huì)在內(nèi)存中開辟一個(gè)連續(xù)的空間;數(shù)組是同一數(shù)據(jù)類型的集合。可以使用數(shù)組下標(biāo)來(lái)引用數(shù)組元素,數(shù)組元素的下標(biāo)都是從0開始,使用下標(biāo)不要超出范圍,否則會(huì)拋出異常??梢允褂?code>length屬性獲取數(shù)組的長(zhǎng)度。對(duì)于多維數(shù)組,實(shí)際開發(fā)中建議不要使用超過(guò)三維的數(shù)組,否則會(huì)讓你的程序難以理解和維護(hù)。