1. 程式人生 > 其它 >排序演算法 -- 冒泡&快排

排序演算法 -- 冒泡&快排

Java程式設計思想讀書筆記(三)

現在是2022年五月二十八日23:14分,今天讀書筆記開始了,

今天咱們開啟第三章了,第三章控制程式流程。

“就像任何有感知的生物一樣,程式必須能操縱自己的世界,在執行過程中做出判斷和選擇。”這句話摘自本書,我覺得很經典。

這一章是入門java的基礎,控制流程非常的重要,程式是否能夠正常的執行,與這個也密切相關。

第一節 使用Java運算子

Java運算子 ,運算子是以一個或多個自變數為基礎,可生成一個新值。

運算子

賦值和算術運算子

賦值運算子=是最常用的運算子,其實就是將我們等號右邊的結果,傳遞給等號左邊的變數,例如:

int a = 10;
int b = 1 + 8;
int c = 5 * 5;

算術運算子也就是我們在小學階段學習的+ - * / %,分別代表加減乘除還有取餘,例如:

int a = 2;
int b = 3;
int c = a * b;
//結果為6

需要注意的是,+還可以用作字串連線符使用:

System.out.println("lbw" + "nb");  //lbwnb

當然,字串可以直接連線其他型別,但是會全部當做字串處理:

int a = 7, b = 15;
System.out.println("lbw" + a + b); //lbw715

算術運算子還包括++--也就是自增和自減,以自增為例:

int a = 10;
a++;
System.out.println(a); //輸出為11

自增自減運算子放在變數的前後的返回值是有區別的:

int a = 10;
System.out.println(a++);  //10 (先返回值,再自增)
System.out.println(a);   //11
int a = 10;
System.out.println(++a);  //11 (先自增,再返回值)
System.out.println(a);  //11
int a = 10;
int b = 2;
System.out.println(b+++a++);  //猜猜看結果是多少

為了使得程式碼更簡潔,你還可以使用擴充套件的賦值運算子,包括+=-=/=*=%=,和自增自減類似,先執行運算,再返回結果,同時自身改變:

int a = 10;
System.out.println(a += 2);  //等價於 a = a + 2

關係運算符

關係運算符的結果只能是布林型別,也就是要麼為真要麼為假,關係運算符包括:

> < == //大於小於等於
>= <=  !=  //大於等於,小於等於,不等於

關係運算符一般只用於基本型別的比較,運算結果只能是boolean:

int a = 10;
int b = 2;
boolean x = a > b;
System.out.println(x);
//結果為 true

邏輯運算子

邏輯運算子兩邊只能是boolean型別或是關係/邏輯運算表示式,返回值只能是boolean型別!邏輯運算子包括:

&& //與運算,要求兩邊同時為true才能返回true
|| //或運算,要求兩邊至少要有一個為true才能返回true
! //非運算,一般放在表示式最前面,表示式用括號擴起來,表示對錶達式的結果進行反轉

實際案例來看看:

int a = 10;
int b = 2;
boolean x = a > b && a < b;  //怎麼可能同時滿足呢
System.out.println(x);   //false
int a = 10;
int b = 2;
boolean x = a > b || a <= b;  //一定有一個滿足!
System.out.println(x);   //true
int a = 10;
int b = 2;
boolean x = !(a > b); //對結果進行反轉,本來應該是true
System.out.println(x); //false

位運算子

& //按位與,注意,返回的是運算後的同類型值,不是boolean!
| //按位或
^ //按位異或 0 ^ 0 = 0
~ //按位非

按位運算實際上是根據值的二進位制編碼來計算結果,例如按位與,以4bit為例:

0101 & 0100 = 0100 (只有同時為1對應位才得1)

int a = 7, b = 15;
System.out.println(a & b); //結果為7

三目運算子

三目運算子其實是為了簡化程式碼而生,可以根據條件是否滿足來決定返回值,格式如下:

int a = 7, b = 15;
String str = a > b ? "行" : "不行";  // 判斷條件(只能是boolean,或返回boolean的表示式) ? 滿足的返回值 : 不滿足的返回值 
System.out.println("漢堡做的行不行?"+str);  //漢堡做的行不行?不行

理解三目運算子,就很容易理解後面的if-else語句了。

第二節 執行控制

Java使用的c全部的控制語句,和c或者c++基本上是共通的,但是不支援goto這種有害的操作。

選擇結構

選擇結構包含if和switch型別,選擇結構能夠幫助我們根據條件判斷,再執行哪一塊程式碼。

if語句

就像上面所說,判斷使用者輸入的數字,大於1則輸出ok,小於1則輸出no,要實現這種效果,我們首先可以採用if語句:

if(判斷條件){
  //判斷成功執行的內容
}else{
  //判斷失敗執行的內容
}
//if的內容執行完成後,後面的內容正常執行

其中,else語句不是必須的。

現在,又來了一個新的需求,使用者輸入的是1列印ok,輸入2,列印yes,其他列印no,那麼這樣就需要我們進行多種條件的判斷了,當然if能進行多分支判斷:

if(判斷條件1){
  //判斷成功執行的內容
}else if(判斷條件2){
  //再次判斷,如果判斷成功執行的內容
}else{
  //上面的都沒成功,只能走這裡
}

同樣,else語句不是必須的。

現在,又來了一個新的需求,使用者輸入1之後,在判斷使用者下一次輸入的是什麼,如果是1,列印yes,不是就列印no,這樣就可以用巢狀if了:

if(判斷條件1){
  //前提是判斷條件1要成功才能進來!
  if(判斷條件2){
    //判斷成功執行的內容
  }else{
    //判斷失敗執行的內容
  }
}

switch語句

我們不難發現,雖然else-if能解決多分支判斷的問題,但是效率實在是太低了,多分支if採用的是逐級向下判斷,顯然費時費力,那麼有沒有一直更專業的解決多分支判斷問題的東西呢?

switch(判斷主體){
  case 值1:
    //執行xxx
    break;  //break用於跳出switch語句,不新增會導致程式繼續向下執行!
  case 值2:
    //執行xxx
    break;
  case 值3:
    //執行xxx
    break;
}

在上述語句中,只有判斷主體等於case後面的值時,才會執行case中的語句,同時需要使用break來跳出switch語句,否則會繼續向下執行!

為什麼switch效率更高呢,因為switch採用二分思想進行查詢(這也是為什麼switch只能判斷值相等的原因),能夠更快地找到我們想要的結果!

迴圈結構

小明想向小紅表白,於是他在螢幕上列印了520個 "我愛你",我們用Java該如何實現呢?

for語句

for語句是比較靈活的迴圈控制語句,一個for語句的定義如下:

for(初始條件;迴圈條件;更新){
  //迴圈執行的內容
}
//迴圈結束後,繼續執行
  • 初始條件:迴圈開始時的條件,一般用於定義控制迴圈的變數。
  • 迴圈條件:每輪迴圈開始之前,進行一次判斷,如果滿足則繼續,不滿足則結束,要求為boolean變數或是boolean表示式。
  • 更新:每輪迴圈結束後都會執行的內容,一般寫增量表達式。

初始條件、迴圈條件、更新條件不是缺一不可,甚至可以都缺!

for(int i = 0;i < 520;i++){
  System.out.println("我愛你");
}
for(;;){
  //這裡的內容將會永遠地進行下去!
}

增強for迴圈在陣列時再講解!

while迴圈

while迴圈和for迴圈類似,但是它更加的簡單,只需要新增維持迴圈的判斷條件即可!

while(迴圈條件){
  //迴圈執行的內容
}

和for一樣,每次迴圈開始,當迴圈條件不滿足時,自動退出!那麼有時候我們希望先執行了我們的程式碼再去判斷怎麼辦呢,我們可以使用do-while語句:

do{
  //執行內容
}while(迴圈條件);

一定會先執行do裡面的內容,再做判斷!

ok,今天記錄到此結束,現在是2022年五月29日12點11分,晚安!