《瘋狂Java講義(第4版)》-----第4章【流程控制與陣列】
阿新 • • 發佈:2018-12-11
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]