---
# System prepended metadata

title: 8/25 K速記

---

# 8/25 K速記

## 河內塔 解法
```java=
public static void HanoiMove(int i, char a,char b,char c) {
       
        if (i == 1) {
            System.out.println((i)+": " + a + " -> " + c);
            return; //void 可使用return 脫離，減少if else 後方階層
        }
        
        HanoiMove(i - 1,a,c,b);
        System.out.println((i)+": " + a + " -> " + c);
        HanoiMove(i - 1,b,a,c);
    }
```
以最後目標階層 作為展開，如 i階層 上方有其他階層，使用 河內塔搬移(i-1)2到暫存，
搬完i目標階層，才將(i-1)階層 使用河內塔搬移，從暫存移到目標區，完成動作。


* 字串
```java=
	String str = "2";
```
因字串長度"非固定"，當賦值時候，是回傳address，為java的特例。
若字串被放入函式內，再重新賦值，並不會更改到外部字串。形成類似基本型態參數的感覺。


* Java有分為 編譯時期 / 執行時期
	* ( 編譯時期 ) .java檔案 經過 javac (compiler)轉換為 class檔案
	* ( 執行時期 ) 經由jvm(java虛擬機)轉換為不同平台的執行檔案

heap區域 一般用為 非固定大小的存放區

* new的行為
```java=
	int i = new int[3];
```
new的行為 會在執行時期 新分配heap區的記憶體。 該行為 只會在"執行時期"


```java=
	public static void = new Scanner(System.in);
		Scanner sc = new Scanner(System.in);
		String str1 = "1"+"2";
		String str2 = "12";
		String str3 = sc.nextLine();
		String str4 = sc.nextLine();
		String str5 = new String("12");
		System.out.println(str1 == str2); //true
		System.out.println(str1 == str3); //falae
		System.out.println(str3 == str4); //false
		System.out.println(str1 == str5); //false
```
* 在編譯時期，str1及str2的"12"，因為計算完的值 都相同，會在heap建立，指向同一個位址，故為true。
* str3 及 str4 ，在執行階段 各自在heap 產生一個新位址，於是與原本的str1位址都不相同，故false
* str5 會在執行階段，才在heap被建立，故與str1及str2的位址不同，故為false。

字串比較
str1.equals(str2); 才能比較子串內資料。
若 if (str1==str2) 此時判定是str1及str2的位址是否相同。

* String pool
	* 若在編譯階段，所有固定字串將會先被分配位置，
	* 若只在函式內被使用的字串，在函式未執行或結束後，其字串仍不會被消滅，

* String 物件常用方法
	* str1.compareTo(str2) => 回傳不同字元的 ascii數值差值，若長度不同則回傳1/-1。
	* str1.split(" "); 依照()內字串，進行分離，<正則表示式>


## 函式 多載 (overloading)
```java=
public static void main(String[] args) {
        System.out.println(test()); //1
        System.out.println(test(6)); //6
        System.out.println(test(2,3)); //5
    }
    
    //overloading
    public static int test(){
        return 1;
    }
    
    public static double test(double a){
        return a;
    }
    
    public static int test(int a, int b){
        return a+b;
    }
```
最常見的多載，就 System.out.print() 可輸入各種形態資料都可列印。
有函式及建構子的overloading

## 物件導向
* java為 全物件導向程式語言 (Objactive-Oriented Porgram Languare,OOPL)
* (類別)內 包含 (屬性) 及 (方法)

* 建構子 用來初始化參數，封裝等級可以更改(一般為 public)，