04_Java基礎語法_第4天(數組)_講義
阿新 • • 發佈:2018-08-25
功能 本地方法棧 out 整數 語法 利用 二維數組 多維 name
今日內容介紹
1、流程控制語句switch
2、數組
3、隨機點名器案例
01switch語句解構
* A:switch語句解構 * a:switch只能針對某個表達式的值作出判斷,從而決定程序執行哪一段代碼。 * b:格式如下: swtich(表達式){ case 常量1 : 要執行的語句; break; case 常量2 : 要執行的語句; break; case 常量3 : 要執行的語句; break; default: 要執行的語句; break; } * c: 執行流程: 表達式,和case後面的常量進行比較和哪個case後的常量相同,就執行哪個case後面的程序,遇到break,就全結束 * d: 關鍵字: switch case default break * e:舉例 如果等於1,則輸出星期一 如果等於2,則輸出星期二 如果等於3,則輸出星期三 如果等於4,則輸出星期四 如果等於5,則輸出星期五 如果等於6,則輸出星期六 如果等於7,則輸出星期天
02switch語句的星期判斷
* A: switch語句的星期判斷 * a: 明確需求 需求:初始化int類型變量(1-7)代表星期幾,使用switch語句進行判斷,並打印出該整數對應的星期. * b: 代碼實現 public class SwitchDemo01 { public static void main(String[] args) { int week = 5; switch (week) { case 1: System.out.println("星期一"); break; case 2: System.out.println("星期二"); break; case 3: System.out.println("星期三"); break; case 4: System.out.println("星期四"); break; case 5: System.out.println("星期五"); break; case 6: System.out.println("星期六"); break; case 7: System.out.println("星期天"); break; default: System.out.println("輸入的數字不正確..."); break; } } }
03switch語句接受的數據類型
* A: switch語句接受的數據類型
* a:註意事項
switch語句中的表達式的數據類型,是有要求的
JDK1.0 - 1.4 數據類型接受 byte short int char
JDK1.5 數據類型接受 byte short int char enum(枚舉)
JDK1.7 數據類型接受 byte short int char enum(枚舉), String
04case穿透
* A:case穿透 * a: 在使用switch語句的過程中,如果多個case條件後面的執行語句是一樣的,則 * 該執行語句只需書寫一次即可,這是一種簡寫的方式。 * b: 例如,要判斷一周中的某一天是否為工作日,同樣使用數字1~7來表示星期一到星期 * 天,當輸入的數字為1、2、3、4、5時就視為工作日,否則就視為休息日。
05數組的概述
* A: 數組的概述
* a:數組的需求
現在需要統計某公司員工的工資情況,例如計算平均工資、最高工資等。假設該公司有50名員工,用前面所學的知識完成,
那麽程序首先需要聲明50個變量來分別記住每位員工的工資,這樣做會顯得很麻煩.
* b:數組的概述
數組是指一組數據的集合,數組中的每個數據被稱作元素。在數組中可以存放任意類型的元素
,但同一個數組裏存放的元素類型必須一致。
06數組的定義
* A:數組的定義
* b:格式:
數據類型[] 數組名 = new 數據類型[元素個數或數組長度];
* c:舉例:
int[] x = new int[100];
* c:要點說明
1)數據類型: 數組中存儲元素的數據類型
2) [] 表示數組的意思
3) 變量名 自定義標識符
4) new 創建容器關鍵字
5)數據類型: 數組中存儲元素的數據類型
6)[] 表示數組的意思
7)元素個數,就是數組中,可以存儲多少個數據 (恒定, 定長)
數組是一個容器: 存儲到數組中的每個元素,都有自己的自動編號
自動編號,最小值是0, 最大值,長度-1
自動編號專業名次, 索引(index), 下標, 角標
訪問數組存儲的元素,必須依賴於索引, 公式 數組名[索引]
Java提供一個屬性,操作索引的
數組的一個屬性,就是數組的長度, 屬性的名字 length
使用屬性: 數組名.length 數據類型 int
數組的最小索引是0, 最大索引數組.length-1
07JVM內存劃分
* A:內存劃分
* JVM對自己的內存劃分為5個區域
* a: 寄存器:內存和CUP之間
* b: 本地方法棧: JVM調用了系統中的功能
* c: 方法和數據共享: 運行時期class文件進入的地方
* d: 方法棧:所有的方法運行的時候進入內存
* e: 堆:存儲的是容器和對象
08數組的內存
* A: 數組的內存
* int[] x; // 聲明一個int[]類型的變量
* x = new int[100]; // 創建一個長度為100的數組
* 接下來,通過兩張內存圖來詳細地說明數組在創建過程中內存的分配情況。
* 第一行代碼 int[] x; 聲明了一個變量x,該變量的類型為int[],即一個int類型的數組。
* 變量x會占用一塊內存單元,它沒有被分配初始值
* 第二行代碼 x = new int[100]; 創建了一個數組,將數組的地址賦值給變量x。
* 在程序運行期間可以使用變量x來引用數組,這時內存中的狀態會發生變化
09使用索引訪問數組的元素
* A: 使用索引訪問數組的元素
* 組中有100個元素,初始值都為0。數組中的每個元素都有一個索引(也可稱為角標)
* ,要想訪問數組中的元素可以通過“x[0]、x[1]、……、x[98]、x[99]”的形式。
* 需要註意的是,數組中最小的索引是0,最大的索引是“數組的長度-1”
10數組的length屬性
* A: lenth屬性
* a 在Java中,為了方便我們獲得數組的長度,提供了一個length屬性,
* 在程序中可以通過“數組名.length”的方式來獲得數組的長度,即元素的個數。
* b 求數組的長度
public class ArrayDemo01 {
public static void main(String[] args) {
int[] arr; // 聲明變量
arr = new int[3]; // 創建數組對象
System.out.println("arr[0]=" + arr[0]); // 訪問數組中的第一個元素
System.out.println("arr[1]=" + arr[1]); // 訪問數組中的第二個元素
System.out.println("arr[2]=" + arr[2]); // 訪問數組中的第三個元素
System.out.println("數組的長度是:" + arr.length); // 打印數組長度
}
}
11為數組的元素賦值
* A: 為數組的元素賦值
* a: 如果在使用數組時,不想使用這些默認初始值,也可以顯式地為這些元素賦值。
* 賦值過的元素已經變為新的數值,沒有賦值的元素默認初始化的數值
* b: 案例
public class ArrayDemo02 {
public static void main(String[] args) {
int[] arr = new int[4]; // 定義可以存儲4個整數的數組
arr[0] = 1; // 為第1個元素賦值1
arr[1] = 2; // 為第2個元素賦值2
// 下面的代碼是打印數組中每個元素的值
System.out.println("arr[0]=" + arr[0]);
System.out.println("arr[1]=" + arr[1]);
System.out.println("arr[2]=" + arr[2]);
System.out.println("arr[3]=" + arr[3]);
}
}
12數組的定義_2
* A: 定義數組格式2
* a: 數組初始化
動態初始化 : 在定義數組時只指定數組的長度,由系統自動為元素賦初值的方式稱作動態初始化。
1、類型[] 數組名 = new 類型[長度];
int[] arr = new int[4];
靜態初始化: 在初始化數組時還有一種方式叫做靜態初始化,就是在定義數組的同時就為數組的每個元素賦值。
2、類型[] 數組名 = new 類型[]{元素,元素,……};
int[] arr = new int[]{1,2,3,4};
3、類型[] 數組名 = {元素,元素,元素,……};
int[] arr = { 1, 2, 3, 4 };
13遍歷數組
* A:遍歷數組
* 在操作數組時,經常需要依次訪問數組中的每個元素,這種操作稱作數組的遍歷
* B:練習
public class ArrayDemo04 {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 }; // 定義數組
// 使用for循環遍歷數組的元素
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]); // 通過索引訪問元素
}
}
}
上述代碼中,定義一個長度為5的數組arr,數組的角標為0~4。由於for循環中定義的變量i的
值在循環過程中為0~4,因此可以作為索引,依次去訪問數組中的元素,並將元素的值打印出來
14數組中常見的異常
* A: 數組操作中,常見的兩個異常
數組的索引越界異常
空指針異常
* B: 練習
public class ArrayDemo_4{
public static void main(String[] args){
//數組的索引越界異常
//int[] arr = {5,2,1};
//數組中3個元素,索引 0,1,2
//System.out.println(arr[3]);//java.lang.ArrayIndexOutOfBoundsException: 3
//空指針異常
int[] arr2 = {1,5,8};
System.out.println(arr2[2]);
arr2 = null; // arr2 不在保存數組的地址了
System.out.println(arr2[2]);//java.lang.NullPointerException
}
}
15數組最值
* A: 數組獲取最值的原理思想
* 定義數組的第一個元素arr[0]為最大值;循環arr數組,判斷如果有比arr[0] 大的就交換
* ,直到arr數組遍歷完畢,那麽arr[0]中就保存了最大的元素
16數組獲取最值代碼實現
* A: 代碼實現
public class ArrayDemo05 {
public static void main(String[] args) {
int[] arr = { 4, 1, 6, 3, 9, 8 }; // 定義一個數組
int max = arr[0]; // 定義變量max用於記住最大數,首先假設第一個元素為最大值
// 下面通過一個for循環遍歷數組中的元素
for (int x = 1; x < arr.length; x++) {
if (arr[x] > max) { // 比較 arr[x]的值是否大於max
max = arr[x]; // 條件成立,將arr[x]的值賦給max
}
}
System.out.println("max=" + max); // 打印最大值
}
}
17二維數組的定義
* A 二維數組的作用
* 要統計一個學校各個班級學生的考試成績,又該如何實現呢?
* 這時就需要用到多維數組,多維數組可以簡單地理解為在數組中嵌套數組。
* B 定義格式
* a 第一種定義格式:
* int[][] arr = new int[3][4];
* 上面的代碼相當於定義了一個3*4的二維數組,即二維數組的長度為3,二維數組中的每個元素又是一個長度為4的數組
* b 第二種定義格式
* int[][] arr = new int[3][];
* 第二種方式和第一種類似,只是數組中每個元素的長度不確定
* c 第三種定義格式
* int[][] arr = {{1,2},{3,4,5,6},{7,8,9}};
* 二維數組中定義了三個元素,這三個元素都是數組,分別為{1,2}、{3,4,5,6}、{7,8,9}
18二維數組元素的訪問
* A: 二維數組的訪問
* 案例:
class ArrayDemo08 {
public static void main(String[] args){
//定義二維數組的方式
int[][] arr = new int[3][4];
System.out.println( arr );
System.out.println("二維數組的長度: " + arr.length);
//獲取二維數組的3個元素
System.out.println( arr[0] );
System.out.println( arr[1] );
System.out.println( arr[2] );
System.out.println("打印第一個一維數組的元素值");
System.out.println( arr[0][0] );
System.out.println( arr[0][1] );//訪問的為二維數組中第1個一維數組的第2個元素
System.out.println( arr[0][2] );
System.out.println( arr[0][3] );
System.out.println("打印第二個一維數組的元素值");
System.out.println( arr[1][0] );
System.out.println( arr[1][1] );
System.out.println( arr[1][2] );
System.out.println( arr[1][3] );
System.out.println("打印第三個一維數組的元素值");
System.out.println( arr[2][0] );
System.out.println( arr[2][1] );
System.out.println( arr[2][2] );
System.out.println( arr[2][3] );
}
}
19二維數組內存圖
* A: 二維數組內存圖
* 舉例:int[][] arr = new int[3][2];
* 外層數組長在內存開辟連續的3個大的內存空間,每一個內存空間都對應的有地址值
* 每一個大內存空間裏又開辟連續的兩個小的內存空間.
20二維數組的定義和訪問
* A: 二維數組的定義和訪問
* 格式1:
* int[][] arr = new int[3][]; 不推薦
* 格式2
* int[][] arr = {{1,2,4},{4,7},{0,9,3}};
*
* B: 二維數組的訪問
舉例:int[][] arr = {{1,2,4},{5,8,7},{0,9,3}};
想要打印數組中7這個元素需要先找到大的元素索引{5,7} 索引為2 ,在找7在{5,7}中的索引2
那麽結果為 arr[2][2] 第一個[2]代表大數組中{5,8,7}這個元素索引
第二個[2]代表{5,8,7}中7元素的索引
22二維數組的遍歷
* A:二維數組遍歷
int[][] arr = {{1,2,4},{4,7},{0,9,3}};
先使用for循環遍歷arr這個二維數組,得到每一個元素為arr[i]為一維數組
再外層for循環中嵌套一個for循環遍歷每一個一維數組arr[i],得到每一元素
* B:舉例:遍歷二維數組
public class ArrayArrayDemo_2{
public static void main(String[] args){
int[][] arr = { {1,2,3},{4,5},{6,7,8,9},{0} };
//外循環,遍歷二維數組
for(int i = 0 ; i < arr.length ;i++){
//內循環,遍歷每個一維數組 arr[0] arr[1] arr[i]
for(int j = 0 ; j < arr[i].length; j++){
System.out.print(arr[i][j]);
}
System.out.println();
}
}
* C:二維數組累加求和
class ArrayDemo09 {
public static void main(String[] args){
int[][] arr2 = { {1,2},{3,4,5},{6,7,8,9,10} };
int sum2 = 0;
for (int i=0; i<arr2.length; i++) {
for (int j=0; j<arr2[i].length; j++) {
//System.out.println(arr2[i][j])
sum2 += arr2[i][j];
}
}
System.out.println("sum2= "+ sum2);
}
}
23二維數組的求和練習
* A 例如要統計一個公司三個銷售小組中每個小組的總銷售額以及整個公司的銷售額。如下所示
* 第一小組銷售額為{11, 12}萬元
* 第二小組銷售額為{21, 22, 23}萬元
* 第三小組銷售額為{31, 32, 33, 34}萬元。
* B 代碼實現
public class ArrayDemo10 {
public static void main(String[] args) {
int[][] arr = new int[3][]; // 定義一個長度為3的二維數組
arr[0] = new int[] { 11, 12 }; // 為數組的元素賦值
arr[1] = new int[] { 21, 22, 23 };
arr[2] = new int[] { 31, 32, 33, 34 };
int sum = 0; // 定義變量記錄總銷售額
for (int i = 0; i < arr.length; i++) { // 遍歷數組元素
int groupSum = 0; // 定義變量記錄小組銷售總額
for (int j = 0; j < arr[i].length; j++) { // 遍歷小組內每個人的銷售額
groupSum = groupSum + arr[i][j];
}
sum = sum + groupSum; // 累加小組銷售額
System.out.println("第" + (i + 1) + "小組銷售額為:" + groupSum + " 萬元");
}
System.out.println("總銷售額為: " + sum + " 萬元");
}
}
24隨機點名器案例分析
* A 隨機點名器案例分析
* B: 需求
* 隨機點名器,即在全班同學中隨機的打印出一名同學名字。
* C:分析:
* 1)定義數組存數全班同學
* 2)生成隨機數範圍0 到 數組長度-1
* 3)根據這個索引找到數組中的同學名稱
25隨機點名器代碼實現
* A: 分析
隨機點名器:
1 存儲姓名
2. 預覽所有人的姓名
3. 隨機出一個人的姓名
* B 代碼實現
import java.util.Random;
public class CallName{
public static void main(String[] args){
//存儲姓名,姓名存儲到數組中
//數組存儲姓名,姓名的數據類型,String
String[] names = {"張三","李四","王五","李蕾","韓梅梅","小名","老王","小華","約翰遜","愛麗絲"};
//預覽: 遍歷數組,打印所有姓名
for(int i = 0 ; i < names.length ; i++){
System.out.println(names[i]);
}
System.out.println("=============");
//隨機出一個人的名
//利用隨機數,生成一個整數,作為索引,到數組中找到對應的元素
Random ran = new Random();
//隨機數,範圍必須是0-數組的最大索引
int index = ran.nextInt(names.length);//index 就是隨機數,作為索引
System.out.println(names[index]);
}
}
25隨機點名器代碼實現_2
* A 代碼優化:
import java.util.Random;
public class CallName{
public static void main(String[] args){
String[] names = {"張三","李四","王五","李蕾","韓梅梅","小名","老王","小華","約翰遜","愛麗絲"};
System.out.println(names[new Random().nextInt(names.length)]);
}
}
04_Java基礎語法_第4天(數組)_講義