Java基礎(四)——switch語句、一維陣列、二維陣列的定義、儲存、遍歷、常見問題

kww_發表於2020-11-15

第一章 流程控制語句

 

1.1選擇結構switch

它和if條件語句不同,它只能針對某個表示式的值作出判斷,從而決定程式執行哪一段程式碼。

switch (表示式){
	case 目標值1:
		執行語句1
		break;
	case 目標值2:
		執行語句2
		break;
	......
	case 目標值n:
		執行語句n
		break;
	default:
		執行語句n+1
		break;
}

在上面的格式中,switch語句將表示式的值與每個case中的目標值進行匹配,如果找到了匹配的值,會執行對應case後的語句,遇到break,就全結束。

如果沒找到任何匹配的值,就會執行default後的語句。 

 

1.2switch的穿透性

若case 後面沒有break, 程式就會一直向下穿透。

package day4;

public class SwitchDemo_1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int week = 3;
		switch(week){
			case 1:
			case 2:
			case 3:
			case 4:
			case 5:
			  System.out.println("工作日");
			  break;
			
			case 6:
			case 7:
			  System.out.println("休息日");
			  break;
			
		}
	}

}

結果:

補充:

switch語句中的表示式的資料型別是有要求的:

  •  JDK1.0 - 1.4 資料型別接受 byte short int char
  •  JDK 1.5 資料型別接受byte short int char enum(列舉)
  •  JDK1.7資料型別接受byte short int char enum(列舉) String

 enum weekday {sun, mou, tue, wed, thu, fri, sat } ;
該列舉名為weekday,列舉元素有7個,凡是被說明為weekday型別變數的取值只能是7天中的某一個值。

 

第二章 陣列

陣列是指一組資料的集合,陣列中的每個資料被稱作元素。在陣列中可以存放任意型別的元素,但同一個陣列裡存放的元素型別必須一致。

2.1陣列的定義

陣列定義格式:

  • 資料型別[]   陣列名 = new 資料型別[元素個數/陣列長度]
  • 例如:int[]  a= new int[10]//其為引用資料型別,因此使用new

為了更好地理解陣列的這種定義方式,可以將上面的一句程式碼分成兩句來寫,具體如下:

  • int[] x;              // 宣告一個int[]型別的變數
  • x = new int[100];   // 建立一個長度為100的陣列

所有的硬體由作業系統管理,java程式在jvm上執行,則jvm將向作業系統申請記憶體。

作業系統分給jvm64M的記憶體,jvm又將記憶體進行劃分,分為5個區域。

JVM記憶體劃分:

  • 暫存器:記憶體與cpu之間的操作。
  • 本地方法棧:有些功能jvm完成不了,需要呼叫作業系統的中的功能。
  • 方法和資料共享區:執行時期.class檔案進入記憶體的地方。(程式執行的是.class檔案)
  • 方法棧:所有的方法執行的時候,進入的記憶體區域。(程式執行時main方法儲存的地方)
  • 堆:儲存的是容器和物件

申請與清理記憶體jvm將自己完成,不需要程式開發者完成。但c++中,開闢空間不需要開發者,清理記憶體需要開發者完成。

執行一個.class檔案,其在記憶體中的操作:

  • 其先.class檔案進入方法和資料共享區
  • 其次,main方法進入方法棧,即入棧執行(也稱壓棧執行)
  • JVM在堆記憶體開闢空間,儲存陣列容器。因此陣列就有了記憶體地址(假設為首地址為0xAB)
  • JVM將陣列首地址(0xAB)傳給變數arr。(這也是arr為引用型別的原因,變數中儲存的是變數地址,而不是值。)

因為陣列內部在記憶體中是連續的,因此找到第一個地址,就能找到之後元素的地址。

當main執行結束是,arr也就沒有了,因此我們是不需要參與記憶體清理的。

陣列的記憶體圖: 

public class ArrayDemo01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = new int[10];
		System.out.println(arr);  //[I@15db9742,@是分隔符,後面的15db9742是16進位制的記憶體地址			
	}
}

結果: 

每次執行的結果可能不一樣,因為虛擬機器每次開的記憶體地址不一樣。

  • int型陣列預設值為0,這是因為當陣列被成功建立後,陣列中元素會被自動賦予一個預設值。
  • 陣列中的每個元素都有一個索引(也可稱為角標),要想訪問陣列中的元素可以通過x[0]、x[1]的形式。
  • 需要注意的是,陣列中最小的索引是0,最大的索引是“陣列的長度-1”。

在Java中,為了方便我們獲得陣列的長度,提供了一個length屬性

  • 獲得陣列的長度的方法:陣列名.length
  • 陣列型別為:int
  • 陣列最大索引為:陣列名.length-1(減1,是因為陣列標號從0開始)

陣列定義的兩種方式:

  • 動態初始化:在定義陣列時只指定陣列長度,由系統為元素賦初值。
  • 靜態初始化:定義陣列的同時,就為陣列每個元素賦值。

兩種靜態初始化的方式:

  • 型別[ ] 陣列名 = new 型別[ ] {元素,元素,......};

               int[] arr2 = new int[] {1,2,3,4};

  • 型別[ ] 陣列名 = {元素,元素,......};

                int[] arr1 = {1,2,3};

public class ArrayDemo01 {

	public static void main(String[] args) {

		//靜態
		int[] arr1 = {1,2,3};
		System.out.println(arr1[2]);
        //靜態,此種易錯,不推薦使用
		int[] arr2 = new int[] {1,2,3,4};
		System.out.println(arr2[0]);
		
	}
}

 結果:

2.2 陣列的遍歷

遍歷:依次訪問陣列中的每個元素

public class ArrayDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = {1,2,3,4,5,6,7};
		for(int i =0;i<arr.length;i++) {
			System.out.println(arr[i]);
		}
	}

}

 結果:

2.3陣列常見問題

 陣列的異常

  •  陣列的索引越界異常(ArrayIndexOutOfBoundsException)
  •  空指標異常(NullPointerException)

2.3.1越界異常

public class ArrayDemo_1 {
	public static void main(String[] args) {
		int[] arr = {1,2,3,4,5,6,7};
		System.out.println(arr[9]);
		
	}

}

結果: 

 

2.3.2空指標異常

public class ArrayDemo_1 {
	public static void main(String[] args) {
		int[] arr = {1,2,3,4,5,6,7};
		System.out.println(arr);
		arr = null ;
		System.out.println(arr[2]);
		
	}

}

結果: 

 

2.3.3陣列空指標異常圖

2.3.4 輸出陣列中的最大值

尋找最大值思路圖:

public class ArrayDemo_2 {
	public static void main(String[] args) {
		//找陣列中的最大值
		int[] arr = {1,11,6,9,5,3,18};
		int max = arr[0];
		for(int i =1;i<arr.length;i++) {
			if (arr[i]>max) {
				max = arr[i];
			}	
		}
		System.out.println(max);
	}

}

結果: 

 

2.4二維陣列

二維陣列:陣列中的陣列,陣列中儲存的還是陣列。二維陣列存的是每個陣列的首地址。

2.4.1二維陣列儲存圖:

2.4.2二維陣列的定義

定義方式:

方法一:
     int[ ][ ] arr = new int[3][4];       //定義了一個三行四列的陣列

     [3]表示:二維陣列中,有三個一維陣列。

     [4]表示:三個一位陣列中,每個陣列的長度都是4。

                  

方法二://不推薦

      int[][] arr = new int[3][];

      arr[0]= new int[1];//必須要new

       arr[1]= new int[2];

       arr[1]= new int[3];

方法三://最簡單的定義方式

      int[][] arr = {{1,2},{3,4,5,6},{7,8,9}};

       

 2.4.3二維陣列越界

public class ArrayArrayDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int[][] arr = {{1,2},{3,4,5,6},{7,8,9}};
		System.out.println(arr[2][3]);//越界
	}

}

 結果:

2.4.4二維陣列的遍歷

public class ArrayArrayDemo_1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[][] arr = {{1,2},{3,4,5,6},{7,8,9}};
		for(int i=0;i<arr.length;i++) {
			for(int j=0;j<arr[i].length;j++) {
				System.out.print(arr[i][j]);
			}
			System.out.println();
		}
	}

}

結果:

2.4.5 舉例1

統計一個公司三個銷售小組中每個小組的總銷售額以及整個公司的銷售額。如下所示

  1. 第一小組銷售額為{11, 12}萬元
  2. 第二小組銷售額為{21, 22, 23}萬元
  3. 第三小組銷售額為{31, 32, 33, 34}萬元。
public class ArrayArrayDemo_2 {

	public static void main(String[] args) {
		int sum = 0;//總銷售額
		
		// TODO Auto-generated method stub
		int[][] arr = {{11, 12},{21, 22, 23},{31, 32, 33, 34}};
		for(int i=0;i<arr.length;i++) {
			int  groupSum=0;// 每個小組的銷售額
			for(int j=0;j<arr[i].length;j++) {
				groupSum+= arr[i][j];
			}
				System.out.println("第"+(i+1)+"個小組營業額為:"+groupSum);
				sum+=groupSum;
		}
			
			System.out.println("總營業額為:"+sum);

	}

}

 結果:

2.4.6 舉例2

隨機點名器,即在全班同學中隨機的列印出一名同學名字。 

import java.util.Random;
import java.util.Scanner;
public class CallName {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] names = {"張三","李四","王五","李蕾","韓梅梅","小名","老王","小華","約翰遜","愛麗絲"};
		System.out.println("輸入1,查詢所有人名");
		System.out.println("輸入2,隨機選一個人名");
		System.out.println("請輸入:");
		Scanner scan = new Scanner(System.in);
		int sc = scan.nextInt();
		switch (sc) {
			case 1:{
				//1.檢視所有同學名字
				for(int j= 0;j<names.length;j++) {
					System.out.print(names[j]+" ");	
				}
				System.out.println();
				break;
			}
			case 2:{
				//2.隨機選一個人
				Random ran = new Random();
				int r = ran.nextInt(names.length)+1;
				System.out.println("第"+r+"位同學為:"+names[r-1]);
				break;
			}
		}
	
		}
}

 結果:

相關文章