iT邦幫忙

0

【左京淳的JAVA學習筆記】第三章 運算子與分歧文

運算子

運算子即計算、比較、位移用的種種符號,欲知詳情請自行google。
讓我們先來看看算數運算子的範例:

class Sample3_1 {
  public static void main(String[] args) {
    System.out.println(10 + 3);
    System.out.println(10 - 3);
    System.out.println(10 * 3);
    System.out.println(10 / 3);
    System.out.println(10 / 3.0);
    System.out.println(10 % 3);
  }
}

將上面的程式跑一遍看看,會發現整數相除時,結果會是整數。與小數相除時,結果會是小數。

延伸1-單項運算子

先來看看以下程式碼

class Sample3_2 {
  public static void main(String[] args) {
    int a = 10;
    int b = a++;
    System.out.println(b);
    a = 10;
    int c = ++a;
    System.out.println(c);
  }
}

a++與++a是什麼意思呢?
a++表示先把a的值代入b裡面之後,再把a的值+1。
++a表示先把a的值+1,再代入c裡面。
所以b的值為10,而c的值則為11。
這個運算子在跑迴圈時經常被使用。

延伸2-關係運算子

關係運算子就是比較兩個值,大於小於等於或是不等於之類的。

class Sample3_3 {
  public static void main(String[] args) {
    int a = 10;int b = 20;
    System.out.println(a > b);
    System.out.println(a < b);
    System.out.println(a == b);
    System.out.println(a != b);
  }
}

延伸3-邏輯運算子

邏輯運算子主要就是AND OR的概念,要注意的是JAVA裡面有兩種AND符號(&和&&)和OR符號(|和||)
單一的&或|符號表示,不管結果是True或False,後半句的程式也會繼續跑完。
連續的&&符號則表示,如果前面的結果是False,返回False的結論,後半句的程式就不跑了。
連續的||符號則表示,如果前面的結果是True,返回True的結論,後半句的程式就不跑了。

跑看看下面的程式會跑出什麼樣的結果

class Sample3_4 {
  public static void main(String[] args) {
    int a = 10;int b = 10;int c = 10;int d = 10;
    boolean result1 = a++ > 10 & ++b > 10;
    System.out.println("result1:" + result1 + " a:" + a + " b:" + b);
    boolean result2 = c++ > 10 && ++d > 10;
    System.out.println("result2:" + result2 + " c:" + c + " d:" + d);
  }
}

執行結果

result1:false a:11 b:11
result2:false c:11 d:10

++b被執行了,而++d沒有被執行。

文字列處理

JAVA提供String及StringBuilder兩個類(class)來協助處理文字。
這兩者的差別也是面試常遇到的題目之一。
基本上String保存資料的方式是唯讀的,無法再做修改。而StringBuilder可以。
在實務上,如果要將多個文字列結合的時候,基於效能考量也會使用StringBuilder來做處理。
這兩個class分別有各自的方法(method)可以使用,看看以下範例:

class Sample3_5 {
  public static void main(String[] args) {
    String s = "abcdefa";
    System.out.println("charAt()     : " + s.charAt(2));
    System.out.println("endsWith()    : " + s.endsWith("fa"));
    System.out.println("indexOf()    : " + s.indexOf('c'));
    System.out.println("replace()    : " + s.replace('a','z'));
    System.out.println("substring()  : " + s.substring(2));
    System.out.println("toUpperCase(): " + s.toUpperCase());
  }
}

執行結果

charAt()     : c
endsWith()    : true
indexOf()    : 2
replace()    : zbcdefz
substring()  : cdefa
toUpperCase(): ABCDEFA

以上結果看起來像是修改了文字列的內容,但其實是新增了一個文字列,而不是修改原本的文字列。

再來看看StringBuilder的範例:

class Sample3_6 {
  public static void main(String[] args) {
    StringBuilder sb1 = new StringBuilder("Ab Cdefge");
      System.out.println("append()     : " + sb1.append("XYZ"));
    StringBuilder sb2 = new StringBuilder("Ab Cdefge");
      System.out.println("insert()     : " + sb2.insert(2,"ZZ"));
    StringBuilder sb3 = new StringBuilder("Ab Cdefge");
      System.out.println("reverse()     : " + sb3.reverse());
    StringBuilder sb4 = new StringBuilder("Ab Cdefge");
      sb4.setCharAt(3,'Z');
      System.out.println("setCharAt()     : " + sb4);
    StringBuilder sb5 = new StringBuilder("Ab Cdefge");
      System.out.println("delete()     : " + sb5.delete(0,5));
    StringBuilder sb6 = new StringBuilder("Ab Cdefge");
      System.out.println("replace()     : " + sb6.replace(3,sb6.length(),"YYYY"));
    StringBuilder sb7 = new StringBuilder("Ab Cdefge");
      System.out.println("substring()     : " + sb7.substring(5,7));
    StringBuilder sb8 = new StringBuilder("Ab Cdefge");
      System.out.println("substring()     : " + sb8.substring(5));
  }
}

執行結果

append()     : Ab CdefgeXYZ
insert()     : AbZZ Cdefge
reverse()     : egfedC bA
setCharAt()     : Ab Zdefge
delete()     : efge
replace()     : Ab YYYY
substring()     : ef
substring()     : efge

大部分的方法都很直覺可以理解,不懂的部分再找咕狗大神。

Data的比較

在比較兩個值的時候,依照data類型可分為以下兩種狀況

  1. 基本型data的比較
  2. 物件的比較

基本型的data在做比較時,只要值相同,不同類型的data也會返回Ture結果
例如:

int i = 10; double b = 10.0;
System.out.println(i == b);

結果會顯示true
但是物件之間的比較就不一樣了,"=="符號比較的是兩個物件是否為同一個物件,而不是值是否相等。

class Sample3_7 {
  public static void main(String[] args) {
    int[] a1 = {10}; int[] a2 = {10}; int[] a3 = a1; 
    System.out.println("a1 == a2     : " + (a1 == a2));
    System.out.println("a1 == a3     : " + (a1 == a3));
  }
}

執行結果

a1 == a2     : false
a1 == a3     : true

可以發現這種比較方式,在實務上會有困擾。
比如說今天想比較文字列A和文字列B的內容是否一樣,但是用"=="符號只會得到false。
這時候就要使用String類的.equals()方法來做比較。

class Sample3_8 {
  public static void main(String[] args) {
    String s1 = new String("Tom"); 
    String s2 = new String("Tom"); 
    System.out.println("s1 == s2     : " + (s1 == s2));
    System.out.println("s1.equals(s2): " + (s1.equals(s2)));
  }
}

執行結果

s1 == s2     : false
s1.equals(s2): true

注意:如果沒有使用new String()方法來新增文字列,而是使用以下的方式賦值,
那麼s1和s2會參照到記憶體上同樣的位址(即同物件)。

class Sample3_9 {
  public static void main(String[] args) {
    String s1 = "Tom"; String s2 = "Tom";
    System.out.println("s1 == s2     : " + (s1 == s2));
    System.out.println("s1.equals(s2): " + (s1.equals(s2)));
  }
}

執行結果

s1 == s2     : true
s1.equals(s2): true

傑克這真是太神奇了!

if條件式

文法如下
if(條件){
執行內容
}else if(條件2){
執行內容
}else{
執行內容
}

if的部分比較單純,這邊就先跳過,需要的人請拜一下估狗大神。

條件運算子

設定一個條件,True的話就執行第一個處理,False的話就執行第二個處理。
條件 ? 處理1 : 處理2

class Sample3_10 {
  public static void main(String[] args) {
    int num = 20;
    String str = "num的值為: ";
    str += num < 10 ? "不到10" : "10以上";  // "+="意指把兩個文字列結合之後再覆蓋掉原先的文字列。
    System.out.println(str);
  }
}

執行結果

num的值為: 10以上

switch文

這個不是任天堂的switch。
用途和if類似,不過只能比較byte,char,short,int,enum,String類型的data。(也包含上述基本型data的wrapper class)
文法如下
switch(比較對象){
case 值1:
處理1;
case 值2:
處理2;
default:
處理n;
}

如果有很多條件要比較的話,用switch條列起來比較方便的樣子。
不過使用上也有些要注意的點,看以下範例:

class Sample3_11 {
  public static void main(String[] args) {
    int num = 2;
    switch(num){
     case 1:
      System.out.println("num = 1");
      break;
     case 2:
      System.out.println("num = 2");
     case 3:
      System.out.println("num = 3");
     default:
      System.out.println("num為1,2,3以外的數值");
    }
  }
}

執行結果

num = 2
num = 3
num為1,2,3以外的數值

switch迴圈在使用時要注意,每個處理後面都需加一行break;,
表示執行完後跳出迴圈。如果沒有加的話就會繼續往下執行。即使是不符合條件的處理也會被執行。(傑克已經放棄治療了..)
範例中的case 2就沒有加break,所以繼續往下執行了case 3和default。
default是當所有條件都不符合時,會執行的處理。
不一定要有,也不一定要放在最後面。

以上 是第三章 運算子與分歧文
下一章會講迴圈

參考教材: JAVAプログラマSilver SE8 - 山本 道子


尚未有邦友留言

立即登入留言