banner
Onei

Onei

github
nintendo switch
discord server
steam
pixiv
bento
follow

Java 入門(二)

🎛 流程控制#

分支語句#

  • 單分支
  • 雙分支
  • 多分支

if-else#

switch-case#

switch (x) {
  case y:
    zzz;
    break;
  case a:
    bbb;
    break;
  default:
    ccc;
}

x 中可傳入 byteshortintchar 的數據類型

從 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 表示靜態 不加則為成員
finalabstract 不能同時出現

返回值#

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;
    }
}

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。