1. 程式人生 > >《瘋狂Java講義(第4版)》-----第4章【流程控制與陣列】

《瘋狂Java講義(第4版)》-----第4章【流程控制與陣列】

Java7增強後的switch語句

switch後的控制表示式只能是byte、short、char、int、列舉型別和java.lang.String型別。

char c = 'A';
switch(c){
	case 'A':
		System.out.println("Excellent");
		break;
	case 'B':
		System.out.println("Pass");
		break;
	default:
		System.out.println("Fail");
}

Break和Continue操作外層迴圈

public class HelloWorld{
	
	public static void main(String[] args){
		out://這個out用來標記下面的這個for迴圈
		for(int i=1;i<=3;i++){
			for(int j=1;j<=3;j++){
				if(j==2){
					break out;//結束out下面的那個for迴圈
				}
				System.out.println("i="+i+",j="+j);
			}
		}
		
	}
}

輸出: i=1,j=1

continue有類似用法,不再贅述。

陣列

定義陣列

//定義陣列方式一(推薦使用這種方式):
int[] a;

//定義陣列方式二:
int a[];

注意:上面是在定義陣列,[]裡面一定不要有數字!定義陣列不可指定長度。

陣列初始化

陣列初始化,就是為陣列元素分配記憶體空間,併為每個元素賦初始值。

靜態初始化

//先定義一個數組a
int[] a;
//靜態初始化
a = new int[]{1,2,3};

上面程式碼可以簡化為:int[] a = new int[]{1,2,3}; 上面程式碼可以進一步簡化為:int[] a = {1,2,3};

動態初始化

int[] a = new int[6];//定義和初始化簡化在一起完成
陣列元素型別 陣列元素初始值
byte,short,int,long 0
float,double 0.0
char ‘\u0000’
boolean false
引用型別(類、介面、陣列) null

Java的增強for迴圈過程中,試圖修改陣列元素的值,其實並修改不了!!如下:

public class HelloWorld{
	
	public static void main(String[] args){
		
		String[] fruits = {"apple","pear","banana"};
		
		//嘗試在增強for迴圈的過程中改變fruits的元素的值
		for(String fruit : fruits){
			fruit = "fruit";
			System.out.print(fruit+" ");
		}
		System.out.println();
		
		//發現上面並沒有改變fruits陣列中的元素值,說明for迴圈過程中,
		//fruit指向的僅僅是一個臨時變數,並不是對fruits陣列元素的引用
		for(String fruit : fruits){
			System.out.print(fruit+" ");
		}
	}
}

輸出: fruit fruit fruit apple pear banana

陣列的記憶體分配

陣列是一種引用資料型別,陣列引用變數只是一個引用,陣列引用變數在棧記憶體中,而陣列元素在堆記憶體裡。

例項一

public class HelloWorld{
	
	public static void main(String[] args){
		
		int[] a = {1,2,3};
		int[] b = new int[4];
		
		for(int i=0;i<a.length;i++){
			System.out.print("a["+i+"]="+a[i]+" ");
		}
		System.out.println();
		
		for(int i=0;i<b.length;i++){
			System.out.print("b["+i+"]="+b[i]+" ");
		}
		System.out.println();
		
		b=a;
		for(int i=0;i<b.length;i++){
			System.out.print("b["+i+"]="+b[i]+" ");
		}
	}
}

輸出:

a[0]=1 a[1]=2 a[2]=3
b[0]=0 b[1]=0 b[2]=0 b[3]=0
b[0]=1 b[1]=2 b[2]=3

上述程式的記憶體分配及變化情況: 在這裡插入圖片描述

在這裡插入圖片描述 例項二(引用型別的陣列)

public class HelloWorld{
	
	public static void main(String[] args){

		//定義一個數組		
		Person[] students = new Person[2];

		//定義一個lisi
		Person lisi = new Person();
		lisi.setName("lisi");
		lisi.setSex("mlae");
		
		//定義一個zhangsan
		Person zhangsan = new Person();
		zhangsan.setName("zhangsan");
		zhangsan.setSex("female");
		
		students[0] = lisi;
		students[1] = zhangsan;

		students[0].info();
		lisi.info();
	
		students[1].info();
		zhangsan.info();
		
	}
}

class Person{
	private String name;
	private String sex;

	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return this.name;
	}

	public void setSex(String sex){
		this.sex = sex;
	}	
	public String getSex(){
		return this.sex;
	}

	public void info(){
		System.out.println("My name is "+name+". And I am "+sex+".");
	}
}

輸出: My name is lisi. And I am mlae. My name is lisi. And I am mlae. My name is zhangsan. And I am female. My name is zhangsan. And I am female.

記憶體分配如下: 在這裡插入圖片描述 例項三(二維陣列的真實記憶體情況) 二維陣列本質是一維陣列,陣列元素是一維陣列。

int[][] a = new int[3][];
a[1] = new int[2];
a[1][1] = 666;

在這裡插入圖片描述

java.util.Arrays

Java8在java.util.Arrays工具類裡增強了很多用於並行的函式,這裡不會看這些,僅僅關注常用的幾個函式。具體看官方文件,通俗易懂。

示例:

import java.util.Arrays;

public class HelloWorld{

	public static void main(String[] args){
		
		int[] a = {4,1,3,2,6,5};
		//快速排序,並輸出結果
		Arrays.sort(a,0,a.length);
		for(int x : a){
			System.out.print(x+" ");
		}
		System.out.println();
		
		//二分查詢6所在陣列a的位置(陣列下標)
		System.out.println(Arrays.binarySearch(a,0,a.length,6));

		//複製a[1]到a[3]給陣列b,注意下面函式左閉右開
		int[] b = Arrays.copyOfRange(a,1,4);
		for(int x : b){
			System.out.print(x+" ");
		}
		System.out.println();

		
		int[] c = new int[6];
		//陣列c全部賦值為6
		Arrays.fill(c,0,c.length,6);
		for(int x : c){
			System.out.print(x+" ");
		}
		System.out.println();
		

		//判斷陣列c與陣列a是否相等
		System.out.println(Arrays.equals(a,c));

		//把陣列a也全部賦值為6,再和c比較是否相等
		Arrays.fill(a,0,a.length,6);
		System.out.println(Arrays.equals(a,c));
		
		//把陣列a轉換為字串輸出
		System.out.println(Arrays.toString(a));
	}
}

輸出: 1 2 3 4 5 6 5 2 3 4 6 6 6 6 6 6 false true [6, 6, 6, 6, 6, 6]