本章目錄
10.1 數組概述
10.1.1 數組優勢
在超市的入口處,擺放着許多的電子儲物櫃,每個電子儲物櫃均由若干個儲物箱構成,用於存放不同顧客的物品。
10.1.2 Java中的數組
數組是一個變量,用於將相同數據類型的數據存儲在內存空間中,數組中的所有元素必須屬於相同的數據類型。
數組爲了在內存中能夠存取多個數據更加方便,在設計數組時,數組的結構和基本要素都與生活中的電子儲物櫃非常類似。
數組的特點:
同一個數組中的數組元素必須具有相同的數據類型,且在內存中連續分佈。
無論數組中包含多少個數組元素,該數組只存在一個名稱,即數組名。
數組元素的編號稱爲下標,數組的下標從0 開始
可以通過“數組名[ 下標]”的方式訪問數組中的任何元素。
數組的長度指數組可以存儲元素的最大個數,在創建數組時確定
10.1.3 數組的分類
在Java語言中,存在多種形式的數組。
一維數組
多維數組
交錯數組
10.2 一維數組
10.2.1 數組的定義和使用
在Java語言中,一維數組的使用類似於變量的使用,分爲以下4個步驟:
- 聲明數組
- 創建數組
- 初始化數組
- 引用數組元素
(1)聲明數組:聲明數組是使用數組的第一步,需要說明數組元素的類型以及數組的名稱。
語法:
數據類型 [] 數組名 ; 或數據類型 數組名 [];
示例:
int[] age; // 用於存儲年齡 String names[]; // 用於存儲姓名
注意:
“[]”不能省略,且必須出現在數據類型與數組名之間。
在聲明數組時,不能給定數組的長度。例如:“int [20] age; //錯誤”。
在Java中聲明數組時,中括號可以放在數組名前後,一般我們習慣將中括號寫在數據類型後。
(2)創建數組:在Java語言中,可以通過new 關鍵字創建數組,爲數組分配內存空間。
語法:
數組名 = new 數據類型[數組長度];
示例:age = new int[10];
當然,也可以一步完成數組的聲明與創建:
數據類型[] 數組名 = new 數據類型[數組長度];
示例:int[] age = new int[10];
(3)初始化數組: 在Java語言中,可以通過new 關鍵字創建數組,爲數組分配內存空間。
創建後初始化:
int[] age = new int[10]; for (int i = 0; i < 10; i++) { age[i] = sc.nextInt(); }
創建時初始化:
int[] age = {17,16,18,21,24,22,21,19,20,17}; int[] age = new int[]{17,16,18,21,24,22,21,19,20,17};
默認值初始化:
數據類型
默認值
int
0
float
0.0f
double
0.0
boolean
false
char
‘\0’
(4)引用數組元素:
可以通過以下方式對數組中的元素進行存取(下標越界將會出現的錯誤)
語法:
數組名[下標]
數組可以使用length 屬性在程序中動態獲得數組的長度。
語法:
數組名.length
數組中第一個元素的下標:0
最後一個元素的下標:數組名.length-1
10.2.2 數組的使用案例
示例:輸入本部門5位員工的薪資,並根據用戶輸入的序號爲指定員工進行提薪。若用戶輸入序號出現越界,則提示錯誤。要求:薪資的漲幅不能超過原薪資的20%,若漲幅超過20%,則按照原薪資的20%進行提薪。
注意:
在程序中涉及到數組長度時,不建議直接使用數值常量5,而使用數組的length 屬性動態獲取數組長度。
當用戶輸入員工序號時,員工序號是1~5,而對應的數組元素下標是0~4,因此,對應數組元素的下標= 用戶輸入的員工序號-1。
import java.util.Scanner;
public class EmpSalaryDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//使用數組儲存5位員工的薪資
int[] salary = new int[5];
//用戶輸入的索引
int index;
//用戶輸入提升的薪資
int money;
//使用循環對數組中的每個元素進行賦值
System.out.println("請輸入5位員工的薪資:");
for(int i = 0; i < salary.length; i++) {
salary[i] = sc.nextInt();
}
//用戶輸入的員工序號:1~5,而數組的中的下標:0~4
//員工序號-1:對應成績在數組中的下標
System.out.println("請輸入需要提薪的員工序號:");
index = sc.nextInt()-1;
System.out.println("請輸入所提薪資:");
money = sc.nextInt();
//判斷用戶輸入索引是否越界(0 ~ 長度 ~ -1)
if(index < 0 ||index > salary.length - 1) {
//出現下標越界,提示錯誤
System.out.println("輸入的員工序號不存在,操作失敗!");
}else {
//實現提薪的操作
//原工資的%20
int temp = (int)(salary[index]*0.2);
//若漲幅超過%20,則按照20%漲幅進行提薪
//否則按照實際輸入的薪資進行提薪
if(money > temp) {
money = temp;
salary[index] += money;
}
System.out.println("提薪後工資:"+salary[index]);
}
}
}
10.2.3 實踐練習
10.3 數組的應用(一)
10.3.1 遍歷數組元素
示例:編寫JAVA程序,輸入本部門五位員工的姓名和薪資,輸出五位員工的姓名以及年薪。
分析:
- 需要在程序中存儲五位員工的姓名和薪資,由於數據類型的不同,因此,需要定義兩個數組分別存儲員工姓名和薪資。
- 每個數組都存在下標,可限定兩個數組中同一下標處數據描述同一個員工
//使用數組存儲五位員工的姓名和薪資
String[] name = new String[5];
int[] salary = new int[5];
//使用循環對數組中的每個元素進行賦值
for (int i = 0; i < salary.length; i++) {
System.out.printf("第%d位員工信息:\n", i + 1);
System.out.print("姓名:");
name[i] = sc.next();
System.out.print("薪資:");
salary[i] = sc.nextInt();
}
//遍歷所有數組元素,輸出薪資以及年薪
System.out.println("姓名\t薪資\t年薪");
for (int i = 0; i < salary.length; i++) {
System.out.printf("%s\t%d\t%d\n", name[i], salary[i], 12 * salary[i]);
}
10.3.2 增強型for循環與數組的遍歷
爲簡化對數組的遍歷操作,提高數組遍歷的效率,Java提供了增強型的for循環,該循環專用於數組或集合的遍歷操作。
語法:
for(數據類型 變量:數組) { //循環體 }
數據與數組類型一致
循環變量爲只讀,在循環體中不能修改
10.3.2 foreach循環
示例:使用增強型for循環遍歷一維數組
int nums[] = {1,2,3,4,5,6};
for(int num : nums) {
System.out.println(num);
}
注意:在增強型for循環的循環體中,只能依次獲取數組中元素的值,不能對數組元素的值進行修改。
示例:修改示例,使用增強 for 循環實現數據的遍歷。
// 遍歷所有數組元素
// 輸出姓名
System.out.print(" 姓名 \t");
for (String item : name) {
System.out.print(item + "\t");
}
System.out.println();
// 輸出薪資
System.out.print(" 薪資 \t");
for (int item : salary) {
System.out.print(item + "\t");
}
System.out.println();
// 計算年薪並輸出
System.out.print(" 年薪 \t");
for (int item : salary) {
System.out.print(12 * item + "\t");
}
10.3.3 實踐練習
10.4 數組的應用(二)
10.4.1 求最大值和最小值
以求最大值爲例,最大值即一組數據中最大的值。
首先,第一個上擂臺的人是擂主,然後與下一個競爭對手進行比武,若取勝,則第一個人仍是擂主,否則,競爭對手便成爲擂主,然後擂主繼續與之後的競爭對手進行比武,以此類推,最後站在擂臺上的擂主,便是本次比武的勝利者。
示例:
//定義數組,存儲用戶輸入的成績
int[] scores = new int[5];
//聲明變量,存儲最高成績
int max;
//通過循環對數組進行賦值
System.out.println("請輸入五位同學的成績:");
for (int i = 0; i < scores.length; i++) {
scores[i] = sc.nextInt();
}
//求解最大值
//將數組第一個元素直接賦值max
max = scores[0];
//數組其餘元素與max進行比較,將較大值賦值給max
for (int i = 1; i < scores.length; i++) {
if (scores[i] > max)
max = scores[i];
}
//輸出比較結果
System.out.println("最高成績:" + max);
示例:求最小值的過程與最大值類似,添加代碼實現求最小值。
//求解最大值
//將數組第一個元素直接賦值max
max = scores[0];
min = scores[0];
//數組其餘元素與max進行比較,將較大值賦值給max
for (int i = 1; i < scores.length; i++) {
if (scores[i] > max)
max = scores[i];
if (scores[i] < min)
min = scores[i];
}
System.out.println("最高成績:" + max + ",最低成績:" + min);
10.4.2 數組的排序
示例:在Java中,通過Arrays.sort()方法可以快速實現數組元素的排序(默認按升序排列)
//定義數組,存儲用戶輸入的成績
int[] scores = new int[5];
//通過循環對數組進行賦值
System.out.println("請輸入五位同學的成績:");
for (int i = 0; i < scores.length; i++) {
scores[i] = sc.nextInt();
}
//對數組元素進行排序
Arrays.sort(scores);
//輸出排序結果
System.out.println("成績由低到高:");
for (int item : scores) {
System.out.println(item);
}
示例:當需要實現數組中數據的降序排序時,先使用Arrays.sort()升序排序,再將數組的前半部分和後半部分交換即可。
//scores爲已經升序排序的數組
//翻轉數組,循環次數爲數組長度的一半,如長度是6則只需要交換3次即可。
for (int i = 0; i < scores.length / 2; i++) {
//將數組元素位置顛倒,如0和最後一位,1和倒數第二位
int temp = scores[i];
// scores.length -i -1 可以獲取到當前I下標需要交換的下標
//例如,0下標和最後一位的下標,1下標和數組長度減1再減去I下標
scores[i] = scores[scores.length - i - 1];
scores[scores.length - i - 1] = temp;
}
System.out.println("成績由高到低:");
for (int item : scores) {
System.out.println(item);
}
10.4.3 實踐練習
總結:
- 數組是指將具有相同類型的若干變量按照有序的形式組織起來。
- 數組中存儲的數據稱爲數組元素,同一個數組中數組元素必須具有相同的數據類型,且在內存中連續分佈。
- 數組元素按順序進行存儲和編號,數組元素的編號稱爲下標,數組的下標從0開始。
- 數組元素均存在下標,可以通過“數組名[下標]”的方式訪問數組中的任何元素。
- 數組的使用類似於變量的使用,其步驟分爲:聲明數組、創建數組、初始化數組和引用數組。
- 增強型for循環主要用於遍歷數組或集合,循環變量不能被重新賦值。