1. 运算符
1.1 位运算【了解】
位运算:
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。
位运算符:
~n: 按位取反,运算的规律:0 -> 1, 1 -> 0。 记住公式:n的按位取反结果是: -(n + 1)。 ~3计算过程,先将3转换为二进制0000 0011,再进行位运算 0000 0011 --------- 1111 1100 => -4 &: 按位与,运算的规律:有0即0。 3 & 5 = 1 0011 => 3 0101 => 5 ---- & 0001 => 1 |:按位或,运算的规律:有1即1。 3 | 5 = 7 0011 => 3 0101 => 5 ---- | 0111 => 7 ^:按位异或,运算的规律:同0异1。常常用来交换两个变量的值。 3 ^ 5 = 6 0011 => 3 0101 => 5 ---- ^ 0110 => 6 m << n: 按位左位移,运算的规律:不管m是正数还是负数,右边补0 相当于* 2 ^ n 次方,有溢出风险。 3 << 2 = 12 * 2 ^ 2 0011 => 3 ---- << 1100 => 12 m >> n: 按位右位移,运算的规律:如果m是正数,左边补0,是负数就补1 相当于/ 2 ^ n 次方。 3 >> 2 = 0 / 2 ^ 2 0011 => 3 ---- >> 0000 => 0 m >>> n: 无符号右位移,运算的规律:不管m是正数还是负数,左边永远补0,这样的话,负数移动后就变成了正数,失去了数学意义。 |
代码案例
public class _13BitOperation { public static void main(String[] args) { System.out.println(~3);// -4 System.out.println(~-4);// 3 System.out.println(3 ^ 5);// 6 System.out.println(3 & 5);// 1 System.out.println(3 | 5);// 7 System.out.println(3 << 2);// 12 System.out.println(3 >> 2); System.out.println(3 >>> 2); // 交换变量a和b的值 int a = 3; int b = 5; a = a ^ b; b = a ^ b; a = a ^ b; System.out.println(a);// 5 System.out.println(b);// 3 } } |
反码和补码今天不做讨论。
1.2 逻辑运算【掌握】
1.2.1 逻辑运算(Logical Operation)
用来连接布尔类型的两个值或表达式,逻辑运算两边必须是布尔类型的值或者是布尔类型表达式。通常配合循环和条件语句使用,最终结果也位布尔类型。
1.2.2 逻辑运算符作用
应用于多个条件的组合判断。
1.2.3 逻辑运算符运算规则【掌握】
& :逻辑单与,表示并且,有假即假,没有短路功能,有位运算功能,两边都为true ,结果为true。
| :逻辑单或,表示或者,有真即真,没有短路功能,有位运算功能,只要有一边为true,结果为true。
&& :逻辑双与,表示并且,有假即假,有短路功能,没有位运算功能,两边都为true ,结果为true。
|| : 逻辑双或,表示或者,有真即真,有短路功能,没有位运算功能,只要有一边为true,结果为true。
^ : 逻辑异或,同假异真【了解 现实开发,基本不用】,两边不一样,结果为true ,否则为false。
! :逻辑非,表示取反,非真即假,非假即真 (操作一个变量/值)。
优先级问题:! > &&(&) > ||(|)
代码案例
public class _11LogicalOperation { public static void main(String[] args) { // 苍苍老师,数学成绩100并且语文成绩100,奖励大飞机 int mathScore = 99;// 声明一个int类型变量mathScore表示数学成绩,赋值100 int chineseScore = 100;// 声明一个int类型变量chineseScore表示语文成绩,赋值100 // 用三目运算,表示上面的关系 String str = mathScore == 100 && chineseScore == 100 ? "奖励大飞机" : "打屁股"; System.out.println(str); // !:逻辑非, 表示取反,非真即假,非假即真 (操作一个变量/值) System.out.println(!true);// false System.out.println(!false);// true System.out.println("================== && ===================="); System.out.println(true && true);//true System.out.println(true && false);//false // 下面两句代码 &&前发生了短路。当整个表达式结果可以确定的时候发生短路.可以提高效率 System.out.println(false && true);//false System.out.println(false && false);//false System.out.println("================== & ===================="); System.out.println(true & true);//true System.out.println(true & false);//false // 下面两句代码 &前没有短路,后面还要计算。单与逻辑运算效率低下 System.out.println(false & true);//false System.out.println(false & false);//false System.out.println("================== || ===================="); System.out.println(false || true);//true System.out.println(false || false);//false // 下面两句代码 ||前发生了短路。当整个表达式结果可以确定的时候发生短路.可以提高效率 System.out.println(true || true);//true System.out.println(true || false);//true System.out.println("================== | ===================="); System.out.println(false | true);//true System.out.println(false | false);//false // 下面两句代码 |前没有短路。单或逻辑运算效率低下 System.out.println(true | true);//true System.out.println(true | false);//true System.out.println("================= ^【了解】 ================"); // ^:逻辑异或, 同假异真【用的很少】 System.out.println(false ^ true);//true System.out.println(false ^ false);//false // 下面两句代码 |前没有短路。单或逻辑运算效率低下 System.out.println(true ^ true);//false System.out.println(true ^ false);//true } } |
1.2.4 &&、||和 &、| 的区别?
&&、|| :有短路功能
&、| :没有短路功能
什么是短路?
短路问题:当逻辑运算左边能够确定整个表达式结果值的时候,就会发生短路,不会再计算后面的结果了,这样可以提供程序运算效率。
例如:
&&当左边为false时,右边的就短路了
||当左边为true时,右边的就短路了
验证代码:【了解】
public class _12LogicalOperation { public static void main(String[] args) { // 验证短路,怎么验证短路? int a = 1; System.out.println(a > 2 && ++a == 2); System.out.println(a);// 1,说明&&后面没有运算,证明了短路。 int b = 1; System.out.println(b > 2 & ++b == 2); System.out.println(b);// 2,说明&后面运算了,证明了没有短路。 // 验证优先级,结果为false,表示||优先级高或者相等。true表示&&优先级高。 System.out.println(a > 0 || true && false );// true } } |
2. 选择结构
概念:
选择结构就是让程序有选择的执行,满足条件就执行,不满足就不执行。根据判断的结果来控制程序的流程,是属于流程控制语句。其它两个流程控制语句是顺序结构(程序的执行是从左到右,从上到下)、循环结构(程序重复的干一件事)。
作用:
让程序有选择的执行。例如:用户登录的时候,只有用户名和密码都输入正确才能登录成功等。
-
- if选择结构【掌握】
- if单条件语句
- if选择结构【掌握】
基本语法:
if(判断条件) { 语句; } |
判断条件: 布尔类型的值或者表达式
执行语句:当条件满足时执行语句(可以是一条语句,也可以是一组语句)
代码案例:
public class _01If { public static void main(String[] args) { // 需求1:需要让智能机器人自动充电,充电条件电量低于10 // 声明一个int类型的变量power表示电量,赋值9。 int power = 9; if (power < 10) {// if条件判断,电量power < 10 // 用一个打印语句表示,打印:主人,我被玩没电了,请插我充电! System.out.println("主人,我被玩没电了,请插我充电!"); } } } |
-
-
- if ...else双条件语句
-
基本语法:
if(判断条件) { if语句; } else { else语句; } |
判断条件: 布尔类型的值或者表达式
执行语句:当条件满足时执行if中的语句,不满足则执行else中的语句
代码案例:
public class _01If { public static void main(String[] args) { // 需求2:智能机器人在充电条件电量低于10的时候,自动充电。不小于10,则提醒主人,一起玩耍! // 声明一个int类型的变量power2表示电量,赋值11。 int power2 = 11; if (power2 < 10) {// if条件判断,电量power2 < 10 // 用一个打印语句表示,打印:主人,我被玩没电了,请插我充电! System.out.println("主人,我被玩没电了,请插我充电!"); } else {// else表示power 不小于 10 // 用一个打印语句表示,打印:主人,我们一起耍一下! System.out.println("主人,我们一起耍一下!"); } } } |
-
-
- if...else if多条件语句
-
基本语法:
if(判断条件1) { 语句1; } else if(判断条件2) { 语句2; } else if(判断条件3) { 语句3; } ... else { else语句 } |
判断条件: 布尔类型的值或者表达式
执行语句:按照从上到下顺序匹配条件,如果满足条件1,就执行语句1;如果满足条件2,就执行语句2;如果满足条件3,就执行语句3;
注意:只会执行一个满足的条件,哪怕下面有其它的满足条件的也不会执行了。所有条件都不满足就执行else语句中代码。
代码案例:
public class _01If { public static void main(String[] args) { /* * 需求3:智能机器人在充电条件电量低于10的时候,自动充电。 * power >= 10 并且< 60 提醒主人,一起看片,陶冶情操! * power >= 60 并且< 80 提醒主人,实践检验一下! * power >= 80 并且<= 100 提醒主人,我们来一点激烈的运动! */ // 声明一个int类型的变量power3表示电量,赋值69。 int power3 = 69; if (power3 >= 0 &&power3 < 10) {// if条件判断,电量power3 < 10 // 用一个打印语句表示,打印:主人,我被玩没电了,请插我充电! System.out.println("主人,我被玩没电了,请插我充电!"); } else if(power3 >= 10 && power3 < 60) {// 判断条件:power3 >= 10 && power3 < 60 // 用一个打印语句表示,打印:主人,一起看片,陶冶情操! System.out.println("主人,一起看片,陶冶情操!"); } else if(power3 >= 60 && power3 < 80) {// 判断条件:power3 >= 60 && power3 < 80 // 用一个打印语句表示,打印:主人,实践检验一下! System.out.println("主人,实践检验一下!"); } else if(power3 >= 80 && power3 <= 100) {// 判断条件:power3 >= 80 && power3 <= 100 // 用一个打印语句表示,打印:主人,我们来一点激烈的运动! System.out.println("主人,我们来一点激烈的运动!"); } else {// 所有条件都不满足会执行else // 用一个打印语句表示,打印:主人,我被你玩坏了! System.out.println("主人,我被你玩坏了!"); } } } |
-
-
- 注意事项【了解】
-
1. 选择结构是从上到下开始匹配,一旦匹配上一个条件后,整个条件语句就结束了,
哪怕后面也能匹配上条件也不会执行了 。
2. if 和 if else 语句,后面可以不写{},但是不建议,因为不写{} ,只能控制一行代码。
3. if(){} else if(){}后可以不写 else,一般根据业务需求决定。
代码案例:
public class _04If { public static void main(String[] args) { /* * 1. 选择结构是从上到下开始匹配,一旦匹配上一个条件后,整个条件语句就结束了, 哪怕后面也能匹配上条件也不会执行了 */ if (true) { System.out.println("if"); } else if (true) { System.out.println("else if - 1"); } else if (true) { System.out.println("else if - 2"); } /* * 2. if 和 if else 语句,后面可以不写{},但是不建议 因为不写{} ,只能控制一行代码 */ if (false) // 只能控制一行代码 System.out.println("if true"); System.out.println("if true 后语句"); if (false) // 只能控制一行代码,并且if后不能再写其他代码,否则语法报错 System.out.println("if true"); // System.out.println("if true");// 破坏了if else结构,报错 else // 只能控制一行代码 System.out.println("if true 后语句"); } } |
-
-
- 练习
-
90~100 A等 80-89 B等 70-79 C等 60-69 D等 60以下 E等。 |
2.2 swtich 选择结构【掌握】
大家先一起来看一个需求:
public class _02Switch { public static void main(String[] args) { /* * 请设计一个一周工作计划 * 周一: 好好学习 * 周二:看片学习 * 周三: 实践学习 * 周四: 吃药补补身体! * 周五: 爬山锻炼身体! * 周六: 休息,给身体放个假 * 周日:总结一周所得! */ // 声明一个int类型变量weekDay,表示一周中的某一天。赋值4 int weekDay = 4; if (weekDay == 1) {// 判断weekDay是否==1 System.out.println("周一: 好好学习"); } else if (weekDay == 2) {// 判断weekDay是否==2 System.out.println("周二:看片学习"); } else if (weekDay == 3) {// 判断weekDay是否==3 System.out.println("周三: 实践学习"); } else if (weekDay == 4) {// 判断weekDay是否==4 System.out.println("周四: 吃药补补身体!"); } else if (weekDay == 5) {// 判断weekDay是否==5 System.out.println("周五: 爬山锻炼身体!"); } else if (weekDay == 6) {// 判断weekDay是否==6 System.out.println("周六: 休息,给身体放个假"); } else if (weekDay == 7) {// 判断weekDay是否==7 System.out.println("周日:总结一周所得!"); } else { System.out.println("出错了!"); } } } |
上面的需求我们可以根据学过的if结构实现,但是大家可以发现一个问题,现在上面的判断条件都是一些固定的值,并且代码可读性很差,我们有没有什么方式可以优化一下代码呢?
用switch结构
2.2.1 switch基本语法
声明变量 switch(变量){ case 值1: 功能语句1 功能语句2... break; case 值2: 功能语句1 功能语句2... break; case 值3: 功能语句1 功能语句2... break; default:// 相当于条件语句中else,所有的case匹配不上执行default default语句 break; } |
变量 :可以是局部变量或常量
switch中变量支持的数据类型:
byte/ short / int / char / String(JDK1.7) / 枚举类型(JDK1.5)
执行流程:
switch语句优先从case开始匹配,只有case都没有匹配上才匹配default语句,如果匹配上一个case,则会找最近的break,如果没有,则会一直向下执行,就不会匹配了,直到找到break或者到switch语句结束为止 。 |
代码案例:
public class _02Switch { public static void main(String[] args) { // 通过switch结构优化上面案例代码 // 声明一个int类型变量weekDay2,表示一周中的某一天。赋值4 int weekDay2 = 4; switch (weekDay2) {// switch()中写变量weekDay2 case 1: // 表示匹配weekDay的是1的情况 System.out.println("周一: 好好学习"); System.out.println("周一: 好好学习"); System.out.println("周一: 好好学习"); break;// break表示破坏,这里结束当前switch结构 case 2: // 表示匹配weekDay2的是2的情况 System.out.println("周二:看片学习"); break; case 3: // 表示匹配weekDay2的是3的情况 System.out.println("周三: 实践学习"); break; case 4: // 表示匹配weekDay2的是4的情况 System.out.println("周四: 吃药补补身体!"); break; case 5: // 表示匹配weekDay2的是5的情况 System.out.println("周五: 爬山锻炼身体!"); break; case 6: // 表示匹配weekDay2的是6的情况 System.out.println("周六: 休息,给身体放个假"); break; case 7: // 表示匹配weekDay2的是7的情况 System.out.println("周日:总结一周所得!"); break; default: // 所有情况都不匹配会执行default System.out.println("出错了"); break; } } } |
2.2.2 注意事项
1. 每个case之间顺序可以交换,不影响代码运行。
2. default不一定放在末尾 在所有case失效的时候就会被执行到(推介default写在所有case语句后面)。
3. case中值与 key类型必须一致。
4. 最后一个break可以省略,但不建议。
5. break可以省略,但会导致后续case条件判断失效,按照从上到下顺序执行,直到找到第一个break跳出switch结构,如果没有找则执行到末尾后结束switch结构。
2.2.3 练习题
public class _02Switch { public static void main(String[] args) { /* * 4. 请根据需求完成功能:现有vip5个等级,分别1、2、3、4、5 ,不同等级具有不同的权限, * 分别通过打印语句表示,打印如下: * vip1 : low * vip2 : 一点low * vip3 : 还行 * vip4 : 有点牛皮 * vip5 : 非常牛皮,有小弟和小蜜 */ int vip = 4; switch (vip) { case 1: System.out.println("low"); break; case 2: System.out.println("一点low"); break; case 3: System.out.println("还行"); break; case 4: System.out.println("有点牛皮"); break; case 5: System.out.println("非常牛皮,有小弟和小蜜"); break; default: break; } /* * 请打印输出月份所属于的季节, * 3、4、5 春 * 6、7、8 夏 * 9、10、11 秋 * 12、1、2 冬 */ int month = 1; switch (month) { case 3: case 4: case 5: System.out.println("春"); break; case 6: case 7: case 8: System.out.println("夏"); break; case 9: case 10: case 11: System.out.println("秋"); break; case 12: case 1: case 2: System.out.println("冬"); break; default: System.out.println("出错!"); break; } } } |
2.3 if、switch使用场景
只有比较固定的情况下,使用switch结构,其他情况一律用if语句。
switch不适应区间条件,只适用于一些条件比较固定的场景。例如:vip、星座、QQ状态、月份、礼拜、生肖、季节...
3. 循环结构
为什么要学习循环?
先来看一个需求:
// 请打印10句,我爱Java,Java让我快乐! System.out.println("我爱Java,Java让我快乐!"); System.out.println("我爱Java,Java让我快乐!"); System.out.println("我爱Java,Java让我快乐!"); System.out.println("我爱Java,Java让我快乐!"); System.out.println("我爱Java,Java让我快乐!"); System.out.println("我爱Java,Java让我快乐!"); System.out.println("我爱Java,Java让我快乐!"); System.out.println("我爱Java,Java让我快乐!"); System.out.println("我爱Java,Java让我快乐!"); System.out.println("我爱Java,Java让我快乐!"); |
很明显这样写代码,非常浪费时间,可读性也不好,所以,我们要学习循环解决这样的问题。
3.1 循环概念
定义:循环结构是指在程序中需要重复执行某个功能的一种结构,是一种常见的控制流程。
循环结构需要有一个结束条件,否则会形成死循环,导致内存溢出。
3.2 循环作用
循环结构可以复用代码。
3.3 循环分类
3.3.1 while循环【掌握】
特点:先判断,如果满足条件再循环。
基本语法:
1.初始化条件(根据条件判断是否要写) while(2.循环条件判断){ 3.循环体(重复干的事) 4.循环控制(根据条件判断是否要写) } |
循环条件判断:布尔类型的值或者表达式。
循环体:当循环条件为true时执行循环体,当为false时终止循环,不执行循环体
。
执行流程:
第1次:1. 初始化条件语句 => 2.条件判断语句 => 3. 循环体 => 4. 循环控制语句
第2次:2.条件判断语句 => 3. 循环体 => 4. 循环控制语句
第3次:2.条件判断语句 => 3. 循环体 => 4. 循环控制语句
...
最后1次: 2.条件判断语句
代码案例:
// 请打印10句,我爱Java,Java让我快乐! // 声明一个int类型变量count表示次数,赋值1 int count = 1;// 1. 初始化条件 while (count <= 10) {// count <= 10是 2.循环条件判断 // 打印:我爱Java,Java让我快乐! System.out.println("我爱Java,Java让我快乐! : " + count);// 3.循环体 【重复干的事】 count++;// 次数count+1 4.循环控制语句 } |
3.2.2 do...while循环【掌握】
特点:先执行一次循环体,然后再判断,如果满足条件再循环,只会预执行一次。
一般用在扫雷、获取连接数据库、远程控制、坦克大战、打飞机游戏等场景。
基本语法:
1.初始化条件(根据条件判断是否要写) do { 3.循环体(重复干的事) 4.循环控制(根据条件判断是否要写) } while (2.条件判断);// 注意分号 |
循环条件判断:布尔类型的值或者表达式。
循环体:当循环条件为true时执行循环体,当为false时终止循环,不执行循环体
。
执行流程:
第1次:1. 初始化条件语句 => 3. 循环体 => 4. 循环控制语句
第2次:2.条件判断语句 => 3. 循环体 => 4. 循环控制语句
第3次:2.条件判断语句 => 3. 循环体 => 4. 循环控制语句
...
最后1次: 2.条件判断语句
代码案例:
public class _05While { public static void main(String[] args) { // 请打印10句,我爱Java,Java让我快乐! // 声明一个int类型变量count2表示次数,赋值1 int count2 = 1;// 1. 初始化条件 do { // 打印:我爱Java,Java让我快乐! System.out.println("我爱Java,Java让我快乐! : " + count2);// 3.循环体 【重复干的事】 count2++;// 次数count+1 4.循环控制语句 } while (count2 <= 10);// ()后的分号必须写。 } } |
练习:
1. 输出 1-10的所有的数。 2. 求出 1-10的所有偶数的和。 3. 求出1-10中2的倍数的数字和个数。 |
代码实现:
public class _06While { public static void main(String[] args) { // 1.输出 1-10的所有的数 /* * while(条件判断){ 循环体(重复干的事) } do{ 循环体(重复干的事) }while(条件判断);//注意分号 */ int num = 1; while (num <= 10) { System.out.println(num); num++; } // 2.输出 1-10的所有偶数 /* * 思路: * 1. 先输出1-10所有数字 * 2. 在循环体中判断这个数字是否为偶数,如果是才输出 */ int num2 = 1; while (num2 <= 10) { // 判断当前num2是否是偶数 if (num2 % 2 == 0) { System.out.println(num2); } // 循环控制语句:num2++ num2++; } int num3 = 1; do { // 判断当前num2是否是偶数 if (num3 % 2 == 0) { System.out.println(num3); } // 循环控制语句:num2++ num3++; } while (num3 <= 10); // 3.求出 1-10的所有偶数的和 int num4 = 1; int sum = 0;// 声明一个int类型变量sum赋值0,保存和。 while (num4 <= 10) { // 判断当前num4是否是偶数 if (num4 % 2 == 0) { // 如果是偶数,将所有偶数累加到和sum中 sum += num4; } // 循环控制语句:num4++ num4++; } System.out.println("和:" + sum); int num5 = 1; int sum2 = 0;// 声明一个int类型变量sum赋值0,保存和。 do { // 判断当前num是否是偶数 if (num5 % 2 == 0) { // 如果是偶数,将所有偶数累加到和sum中 sum2 += num5; } // 循环控制语句:num++ num5++; } while (num5 <= 10); System.out.println("和:" + sum2); } } |