流程控制
if-else
if( 條件表達式1 ){
執(zhí)行代碼塊1
}else if( 條件表達式2 ){
執(zhí)行代碼塊2
}else{
執(zhí)行代碼塊3
}
- 條件表達式必須是布爾表達式寝贡,或者是布爾變量;
- 執(zhí)行代碼塊只有一條執(zhí)行語句時愿险,{ }可以省略辆亏;
- if-else是“多選一”結(jié)構(gòu)扮叨,因此else是可選的领迈;
- 根據(jù)條件是“互斥”還是“包含”關(guān)系衷蜓,各部分的條件表達式和執(zhí)行代碼塊的順序存在要求磁浇;
如果條件是“互斥”的置吓,那沒有順序要求;
如果條件是“包含”的构拳,那子級在上、父級在下;
switch-case
switch( 表達式 ){
case 常量1:
執(zhí)行語句1;
break;
case 常量2:
執(zhí)行語句2;
break;
case 常量3:
執(zhí)行語句3;
break;
default:
執(zhí)行語句1;
break;
}
- switch語句中置森,表達式的值必須是以下幾種類型之一:
byte斗埂,short,char凫海,int呛凶,枚舉,String - case后面的常量必須是確定的值行贪,不能是變量名或者表達式漾稀;
- break用來執(zhí)行完一個case分支后跳出switch語句塊,如果沒有break建瘫,程序會自動執(zhí)行到switch的結(jié)尾殷蛇;
- default是可選的荸实,位置也是靈活的,當(dāng)沒有匹配的case時沦辙,執(zhí)行default后面的語句;
- 不同的case可以執(zhí)行同一個語句,因此可以將case進行合并狞玛,比如:
switch(month){
case 3:
case 4:
case 5:
System.out.println("Spring");
break;
case 6:
case 7:
case 8:
System.out.println("Summer");
break;
case 9:
case 10:
case 11:
System.out.println("Autumn");
break;
case 12:
case 1:
case 2:
System.out.println("Winter");
break;
}
for
for ( 初始化部分 ; 循環(huán)條件部分 ; 迭代部分 ){
循環(huán)體
}
- for循環(huán)條件部分為boolean表達式戴已,當(dāng)值為false時休玩,退出循環(huán)呐矾;
- 初始化部分可以聲明多個變量罚随,但必須是同一個類型屠升,用逗號分隔糕殉;
- 迭代部分也可以有多個變量更新赡磅,用逗號分隔咆瘟;
- 無限循環(huán):
for( , , ){
循環(huán)體
} // 表達式中并沒有語句卧檐,會導(dǎo)致無限循環(huán)下去
while/do-while
初始化部分
while( 循環(huán)條件部分 ){
循環(huán)體部分
迭代部分
}
初始化部分
do{
循環(huán)體部分
迭代部分
}while( 循環(huán)條件部分 )
- 兩者的區(qū)別在于do-while在循環(huán)之前至少會執(zhí)行一次循環(huán)體;
- 通過控制while的循環(huán)條件,可以造成無限循環(huán):
while( true ){
循環(huán)體
}
嵌套
一個輸出9*9乘法表的例子:
int num;
for(int i = 1; i <= 9; i++){
for(int j = 1; j <= i; j++){
num = i * j;
System.out.print(j + "*" + i + "=" + num + '\t');
}
System.out.print('\n');
}
break/continue
- 使用{ }定義的一段代碼被稱作代碼塊
- break可以終止并跳出當(dāng)前所處代碼塊的執(zhí)行;
- continue則可以跳過當(dāng)前所處代碼塊的循環(huán)贷帮,直接進行下一次循環(huán)潜必;
- break晒他、continue之后不能有其它的語句,因為程序永遠不會執(zhí)行在其之后的語句;
數(shù)組
數(shù)組概述
- 數(shù)組本身是引用數(shù)據(jù)類型穴墅,而數(shù)組中的元素可以是任何數(shù)據(jù)類型馆里,包括基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。
- 創(chuàng)建數(shù)組對象會在內(nèi)存中開辟一整塊連續(xù)的空間,而數(shù)組名中引用的是這塊連續(xù)空間的首地址瓢阴。
- 數(shù)組的長度一旦確定叠穆,就不能修改嚷硫。
一維數(shù)組
聲明方式
// 數(shù)組聲明;
int a[];
int[] a1;
//int a[5]; // 非法鞋怀,聲明數(shù)組時不能指定其長度
double b[];
String s[];
String[] s1;
// 理論上村斟,type var[] 和 type[] var這兩種方式?jīng)]有什么區(qū)別;
初始化
java中使用new關(guān)鍵字來創(chuàng)建數(shù)組;
動態(tài)初始化:
int arr[] = new int[3];
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
String[] names;
names = new String[3];
names[0] = "kana";
names[1] = "omew";
names[2] = "yuki";
靜態(tài)初始化:
int arr1[] = new int[]{0,1,2};
int arr2[] = {1,2,3};
String[] charas = {"甲","乙","丙"};
數(shù)組的引用
- 定義豌拙、并用運算符new為數(shù)組分配空間之后盅蝗,才可以引用數(shù)組中的每個元素;
- 采用數(shù)組下標(biāo)來引用數(shù)組元素姆蘸,可以是整數(shù)常量或者整型表達式,數(shù)組的下標(biāo)從0開始芙委;
- 每個數(shù)組都有一個屬性length指明它的長度逞敷,例如:a.length 指明數(shù)組a的長度;
- 數(shù)組一旦初始化灌侣,長度是不可變的推捐;
for(int i = 0; i<names.length; i++ ){
System.out.println(names[i]);
}
數(shù)組元素默認初始化值
數(shù)組是引用類型,它的元素相當(dāng)于類的成員變量侧啼,因此數(shù)組一經(jīng)分配空間牛柒,其中的每個元素也被按照成員變量同樣的方式被隱式初始化堪簿。
內(nèi)存解析圖(例)
多維數(shù)組
數(shù)組中的數(shù)組:對于二維數(shù)組的理解,可以看成是一維數(shù)組array1又作為另一個一維數(shù)組array2的元素而存在皮壁。其實椭更,從數(shù)組底層的運行機制來看,并沒有多維數(shù)組蛾魄。
初始化
動態(tài)初始化:
// 動態(tài)初始化虑瀑,格式1
int[][] arr = new int[3][2];
int arr1[][] = new int[3][2];
// 動態(tài)初始化,格式2
int[][] arr2 =new int[3][];
arr2[0] = new int[1];
arr2[1] = new int[2];
arr2[2] = new int[3];
// int[][] arr3 = new int[][3]; // 非法
靜態(tài)初始化:
// 靜態(tài)初始化
int[][] arr4 = new int[][]{{2,3},{4,5,6},{7,8,9}};
java中的數(shù)組不一定都是規(guī)則的矩陣形式
多維數(shù)組的使用
for(int i = 0; i < arr4.length; i++){
for(int j =0; j < arr4[i].length; j++)
System.out.print(arr4[i][j] + " ");
System.out.print('\n');
}
本質(zhì)上還是對數(shù)組下標(biāo)的引用滴须,與一維數(shù)組不同的是多維數(shù)組的循環(huán)為嵌套舌狗;
數(shù)組聲明方式總結(jié)
一維數(shù)組:int x[ ] 或者 int[ ] x;
二維數(shù)組:int y[ ][ ] 或者 int[ ][ ] y 或者 int[ ] y[ ]扔水;
二維數(shù)組內(nèi)存解析圖(例)
數(shù)組涉及的常見算法
復(fù)制數(shù)組
int[] array1, array2;
array1 = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 };
array2 = array1;
這樣是不行的痛侍,表面上看數(shù)組array2的元素確實跟數(shù)組array1的元素一樣,但這其實是復(fù)制了array1引用地址的結(jié)果魔市,兩個數(shù)組在內(nèi)存中指向的是一個空間主届。這就導(dǎo)致了:如果你對數(shù)組array2的元素進行修改,同樣也會影響到array1的元素嘹狞。
正確的方法是岂膳,采用循環(huán)的方式對array2中的元素逐一進行復(fù)制操作:
//復(fù)制array1數(shù)組給array2
array2 = new int[array1.length];
for(int i = 0;i < array2.length;i++){
array2[i] = array1[i];
}
二分查找
這里需要注意的是:循環(huán)停止的條件
理論上說,無論head和end的值怎么改變磅网,都不可能出現(xiàn)head > end 的情況谈截,因為這跟數(shù)組的基本結(jié)構(gòu)是矛盾的;同時在每一次二分查找后涧偷,都會執(zhí)行 end = middle - 1 或者 head = middle + 1 簸喂,來確保程序正常運行。
冒泡排序
int temp;
for(int j = 1; j < arr.length; j++ ){ // 外層循環(huán)是冒泡操作的次數(shù)
for(int i = 0; i < arr.length - j; i++){ // 內(nèi)存循環(huán)是相鄰兩個元素做比較的次數(shù)
if(arr[i] > arr[i + 1]){
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
冒泡排序的本質(zhì)是比較相鄰的兩個元素燎潮,如果第一個比第二個大喻鳄,就對其進行交換(升序);
對每一組相鄰的元素做相同的操作确封,從:
a[1] 和 a[2]
a[2] 和 a[3]
... ...
a[n-1] 和 a[n]
完成以上這個比較流程除呵,最后的a[n]一定是最大的數(shù),到此為止爪喘,執(zhí)行了一次冒泡操作颜曾;
每執(zhí)行一次冒泡操作后,除了最后一個元素秉剑,針對剩下的元素重復(fù)以上操作泛豪,直到?jīng)]有任何一對數(shù)字需要比較為止。
Arrays工具類
Arrays類即為操作數(shù)組的工具類,包含了用來操作數(shù)組(比如排序和搜索)的各種方法诡曙;
使用時臀叙,必須在聲明import java.util.Arrays;
表格中的數(shù)據(jù)類型為執(zhí)行了此工具類方法后返回的值類型:
// Arrays工具類
int[] arr1 = new int[]{1,3,5,7,9};
int[] arr2 = new int[]{1,3,5,7,9};
System.out.println(Arrays.equals(arr1,arr2)); // true
System.out.println(Arrays.toString(arr1)); // [1, 3, 5, 7, 9]
Arrays.fill(arr2, 0);
System.out.println(Arrays.toString(arr2)); // [0, 0, 0, 0, 0]
int[] arr3 = new int[]{-12,-90,5,2,88,60,-17,-44,46,80,32,11,7};
Arrays.sort(arr3);
System.out.println(Arrays.toString(arr3)); // [-90, -44, -17, -12, 2, 5, 7, 11, 32, 46, 60, 80, 88]
System.out.println(Arrays.binarySearch(arr3, 11)); // 7
System.out.println(Arrays.binarySearch(arr3, 10)); // -8 隨機返回一個負數(shù)值
數(shù)組使用的常見異常
此異常編譯時不會報錯,只有執(zhí)行編譯后的程序才會出現(xiàn)提示信息: