🎛 流程控制#
分支語句#
- 單分支
- 雙分支
- 多分支
if-else#
switch-case#
switch (x) {
case y:
zzz;
break;
case a:
bbb;
break;
default:
ccc;
}
x
中可傳入 byte
、short
、int
或 char
的數據類型
從 Java SE 7 開始支持字符串 String
類型 同時 case 標籤須為字符串常量或字面量
不加 break
時會發生 case 穿透
循環語句#
三要素
- 起始值
- 終止條件
- 步長
計數循環#
for(起始值;終止條件;步長){
}
先執行起始值 (只執行一次)
然後執行終止條件 為 false
時終止循環
真假循環#
while(){
}
do{
}while()
至少保證循環一次
跳轉語句#
- continue 跳過本次循環
- break 終止當前循環
outfor:for(int i = 0; i < 5; i+ +) {
for(int j = 0; j < 5; j++) {
if (i == 3){
// continue a;
break outfor;
}
System.out.print(0 + " ");
}
System.out.println()
}
🍂 方法#
一堆代碼的集合 創建空間存儲 並設置名字 可以通過名字找到
目的:代碼重用 易維護 易擴展 更靈活
可設置多個修飾符
修飾符列表#
可有可無 可以有多個 (有些是不能同時出現)
多個修飾符沒有先後順序
權限控制#
- public
- private
- protected
- 留空 (默認包權限)
四選一
static
表示靜態 不加則為成員
final
和 abstract
不能同時出現
返回值#
return 作用#
- 終止方法運行
- 將數據返回到調用處
如果無返回值 且存在 return 那麼此時只能終止方法運行 不會返回數據
類型#
- 靜態方法
在類體中,被static
修飾的變量 - 成員方法
在類體中,沒有被static
修飾的變量 - 構造方法
調用#
前綴。方法名 (參數)
方法被調用才會執行,並會把結果返回給調用處
- 靜態方法
類名.方法名(參數)
如果調用當前類中的靜態方法類名可以省略 - 成員方法
對象.方法名(參數)
重載#
方法名相同 參數列表不同 (個數不同或類型不同)
迴圈#
迴圈和迭代 (循環) 等價
以此類推,同時也是循環的基本思想
迴圈和迭代是等價的,迭代就是循環
循環可以做的,迴圈也能做,但是迴圈能做的,循環不一定能做
一般樹狀結構都可以遍歷查詢等操作
迴圈需要頻繁壓棧彈棧,比較消耗內存,並且效率較低,所以循環能完成的,就不要使用迴圈
能使用循環搞定的,就不要使用迴圈,除非循環搞不定
例如:獲取目錄下所有的文件 (包括子文件夾中的文件)
比如 樹狀結構 目錄遍歷等都需要使用迴圈完成
需要有初始值 終止條件 步長 否則會死循環 (一直壓棧 不會彈棧 導致棧內存溢出)
- 直接迴圈
- 間接迴圈
📚 數組#
放置在堆內存中 引用類型 內置對象
內存地址查詢 查詢、修改速度快
連續存儲 數組長度不能修改
數據結構#
計算機中存儲、組織數據的方式。數據結構是一種具有一定邏輯關係,在計算機中應用某種存儲結構,並且封裝了相應操作的數據元素集合。它包含三方面的內容,邏輯關係、存儲關係及操作。
聲明#
- 靜態聲明
數據類型[] 變量名 = {值,值,值,值}
數據類型 變量名[] = {值,值,值,值}
- 動態聲明
數據類型 變量名[] = new 數據類型[長度]
不推薦
數據類型[] 變量名 = new 數據類型[長度]
數據類型[] 變量名 = new 數據類型[長度]{值,值,值,值}
數組使用#
長度 數組.length
查詢 數組 [下標]
遍歷 fori
傳值傳址#
傳址
數組複製#
替換合併
System.arraycopy(源數組,源數組起始位置,目標數組,目標數組起始位置,複製個數)
排序#
冒泡排序 BubbleSort#
算法步驟#
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
- 針對所有的元素重複以上的步驟,除了最後一個。
- 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
import java.util.Arrays;
public class BubbleSort {
public int[] sort(int[] sourceArray) {
// 對 arr 進行拷貝,不改變參數內容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
for (int i = 1; i < arr.length; i++) {
// 設定一個標記,若為true,則表示此次循環沒有進行交換,也就是待排序列已經有序,排序已經完成。
boolean flag = true;
for (int j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = false;
}
}
if (flag) {
break;
}
}
return arr;
}
}
選擇排序 SelectionSort#
算法步驟#
- 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
- 然後再從剩余未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。
- 以此類推,直到所有元素均排序完畢。
public class SelectionSort {
public void sort(int[] arr) {
int minIndex;
for(int i = 0;i < arr.length;i++) {
minIndex = i;
//遍歷找出未排序中的元素中最小值下標
for(int j = i;j < arr.length;j++) {
if(arr[j] < arr[minIndex]) {
minIndex = j;
}
}
//若最小值下標與未排序中最左側下標不一致則交換
if(minIndex != i) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
}
查找#
順序查找#
二分查找#
又稱為折半查詢
查詢步驟#
每次都和中間數據進行比較
目標數據大於中間數據,結束索引不變,起始索引 = 中間索引 + 1, 再生成中間索引
目標數據小於中間數據,起始索引不變,結束索引 = 中間索引 - 1, 再生成中間索引
當起始索引,大於結束索引時,終止,說明不存在該數據
- 缺點:必須建立在已排序的基礎之上
- 優點:因為每次篩選一半,所以效率比較高,儘管數據靠前或者靠後,查詢性能都比較均衡
public class Search {
public int binarySearch(int[] array, int target) {
// 默認起始索引
int startIndex = 0;
// 默認結束索引
int endIndex = array.length - 1;
// 默認中間索引
int index = (startIndex + endIndex) / 2;
for (int i = 0; i < array.length; i++) {
// 目標數據大於中間數據,結束索引不變,起始索引=中間索引+1,再生成中間索引
if (target > array[index]) {
startIndex = index + 1;
// 目標數據小於中間數據,起始索引不變,結束索引=中間索引-1,再生成中間索引
} else if (target < array[index]) {
endIndex = index - 1;
} else if (target == array[index]) {
return index;
}
index = (startIndex + endIndex) / 2;
}
return -1;
}
}