【左京淳的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 - 山本 道子


<<:  参考监视器(Reference monitor)

>>:  [Day 27] 系统开发导入(上)

Day 33 (MySQL)

1.安装 (1)官方网站(只有MySQL) https://dev.mysql.com/ (2)下载...

第49天~

这个得上一篇:https://ithelp.ithome.com.tw/articles/10258...

Day 27 - ios 开发实作(今天还要继续吃吗APP-1、Swift UI Passing data 不同页面传值)

首先我们介绍一下这个APP的功能。 介绍 这个APP主要会有的功能如下: 计算今天吃的东西类型 计算...

Day20 Laravel - test

在Day19时搭配RESTful API风格的CRUD做出了一个留言板的功能,但也发现到了每次要确认...

Day6. 常见原型种类及制作方式

建立原型要点 根据 Google Glass 案例里提到的经验总结,制作低精度原型目的是为了及早失败...