读书笔记

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分,晚安!