运算符&流程控制
1、运算符
1.1、算术运算符
算术运算符: + - + - * / % (前)++ (后)++ (前)-- (后)-- +
1.2、赋值运算符
赋值运算符:= += -= *= /= %=
【特别说明的】
-
s1 += 2; 不会改变变量本身的数据类型
-
开发中,如果希望变量实现+2的操作,有几种方法?(前提:int num = 10;)
//方式一:num = num + 2; //方式二:**num += 2; (推荐)** -
开发中,如果希望变量实现+1的操作,有几种方法?(前提:int num = 10;)
//方式一:num = num + 1; //方式二:num += 1; //方式三:**num++; (推荐)**
eg:
int i2,j2;
//连续赋值
i2 = j2 = 10;
//***************
int i3 = 10,j3 = 20;
int num1 = 10;
num1 += 2;//num1 = num1 + 2;
System.out.println(num1);//12
int num2 = 12;
num2 %= 5;//num2 = num2 % 5;
System.out.println(num2);
short s1 = 10;
//s1 = s1 + 2;//编译失败
s1 += 2;//结论:不会改变变量本身的数据类型
System.out.println(s1);
1.3、比较运算符
比较运算符(关系运算符): == != > < >= <= instanceof
【特别说明的】
- 比较运算符的结果是boolean类型
< >= <= :只能使用在数值类型的数据之间
== 和 !=: 不仅可以使用在数值类型数据之间,还可以使用在其他引用类型变量之间
eg:
Account acct1 = new Account(1000);
Account acct2 = new Account(1000);
boolean b1 = (acct1 == acct2);//比较两个Account是否是同一个账户。b1 = Fals
boolean b2 = (acct1 != acct2);//True
1.4、逻辑运算符
逻辑运算符:& && | || ! ^
区分& 与 &&
相同点1:& 与 && 的运算结果相同
相同点2:当符号左边是true时,二者都会执行符号右边的运算
不同点:当符号左边是false时,&继续执行符号右边的运算。&&不再执行符号右边的运算
开发中,推荐使用&&
区分:| 与 ||
相同点1:| 与 || 的运算结果相同
相同点2:当符号左边是false时,二者都会执行符号右边的运算
不同点3:当符号左边是true时,|继续执行符号右边的运算,而||不再执行符号右边的运算
开发中,推荐使用||
1.5、位运算符
位运算符:<< >> >>> & | ^ ~
【面试题】 你能否写出最高效的2 * 8的实现方式?
- 位运算符操作的都是整型的数据
- << :在一定范围内,每向左移1位,相当于 * 2;>> :在一定范围内,每向右移1位,相当于 / 2
典型题目:
**eg:**实现60的二进制到十六进制的转换
//方式一:自动实现
String str1 = Integer.toBinaryString(60);
String str2 = Integer.toHexString(60);
//方式二:手动实现
int i1 = 60;
int i2 = i1&15;
String j = (i2 > 9)? (char)(i2-10 + 'A')+"" : i2+"";
int temp = i1 >>> 4;
i2 = temp & 15;
String k = (i2 > 9)? (char)(i2-10 + 'A')+"" : i2+"";
System.out.println(k+""+j);
1.6、三元运算符(重点)
三元运算符:(条件表达式)? 表达式1 : 表达式2
【典型代码】
- 获取两个整数的较大值
- 获取三个数的最大值
【特别说明的】 - 凡是可以使用三元运算符的地方,都可以改写为if-else。反之,不成立。
- 如果程序既可以使用三元运算符,又可以使用if-else结构,那么优先选择三元运算符。原因:简洁、执行效率高
2、流程控制
2.1、分支结构
2.1.1、if-else条件判断结构
if(条件表达式){
执行表达式1
}else if(条件表达式){
执行表达式2
}else if(条件表达式){
执行表达式3
}
...
else{
执行表达式n
}
说明:
- if-else结构是可以相互嵌套的
- 如果if-else结构中的执行语句只有一行时,对应的一对{}可以省略的。但是,不建议大家省略
2.1.2、switch-case选择结构
switch(表达式){
case 常量1:
执行语句1;
//break;
case 常量2:
执行语句2;
//break;
...
default:
执行语句n;
//break;
}
说明:
- 根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句;
- 当调用完执 行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或此switch-case结构
末尾结束为止; - break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构;
- switch结构中的表达式,只能是如下的6种数据类型之一:
byte 、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增) - case 之后只能声明常量。不能声明范围;
- break关键字是可选的;
- default:相当于if-else结构中的else
- 如果switch-case结构中的多个case的执行语句相同,则可以考虑进行合并;
2.2、循环结构(重点)
循环结构的四要素:
- 初始化条件
- 循环条件 —>是boolean类型
- 循环体
- 迭代条件
说明:通常情况下,循环结束都是因为②中循环条件返回false了
2.2.1、三种循环结构
1、for循环结构
for(①;②;④){
③
}
执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②
2、while循环结构
while(②){
③;
④;
}
执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②
3、do-while循环结构
do{
③;
④;
}while(②);
执行过程:① - ③ - ④ - ② - ③ - ④ - ... - ②
说明:
- 开发中,基本上我们都会从for、while中进行选择,实现循环结构
- 区别:for循环和while循环的初始化条件部分的作用范围不同
- do-while循环至少会执行一次循环体!
- 开发中,使用for和while更多一些。较少使用do-while
2.2.2、无限循环
“无限循环”结构: while(true) 或 for( ;;)
总结:如何结束一个循环结构?
- 方式一:当循环条件是false时
- 方式二:在循环体中,执行break
2.2.3、嵌套循环
说明:
- 假设外层循环需要执行m次,内层循环需要执行n次。此时内层循环的循环体一共执行了m * n次
- 外层循环控制行数,内层循环控制列数
练习:
//练习二:
/* i(行号) j(*的个数)
* 1 1
** 2 2
*** 3 3
**** 4 4
***** 5 5
*/
for(int i = 1;i <= 5;i++){//控制行数
for(int j = 1;j <= i;j++){//控制列数
System.out.print("*");
}
System.out.println();
}
重点
重点:输出100以内所有质数(素数):只能被1和它本身整除的自然数
//输出100以内所有质数(素数):只能被1和它本身整除的自然数
class LfqExer{
public static void main(String[] args){
boolean isFlag = true;
for(int i = 2; i <=100; i++){
for(int j = 2; j < i; j++){
if(i % j == 0){
isFlag = false;
}
}
if(isFlag == true){
System.out.println(i);
}
isFlag = true;
}
}
}
//输出100以内所有质数(素数) 改进版---1
class LfqExer{
public static void main(String[] args){
boolean isFlag = true;
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long start = System.currentTimeMillis();
for(int i = 2; i <=100; i++){
// for(int j = 2; j < i; j++){
for(int j = 2; j <= Math.sqrt(i); j++){ //优化2:对本身是质数的自然数
if(i % j == 0){
isFlag = false;
//优化1:只对本身非质数的自然数是有效的
break;
}
}
if(isFlag == true){
System.out.println(i);
}
isFlag = true;
}
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long end = System.currentTimeMillis();
System.out.println("所花费的时间为:" + (end - start));
}
}
//输出100以内所有质数(素数) 改进版---2
class LfqExer{
public static void main(String[] args){
//boolean isFlag = true;
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long start = System.currentTimeMillis();
label : for(int i = 2; i <=100; i++){
// for(int j = 2; j < i; j++){
for(int j = 2; j <= Math.sqrt(i); j++){ //优化2:对本身是质数的自然数
if(i % j == 0){
//isFlag = false;
//break;优化1:只对本身非质数的自然数是有效的
continue label;
}
}
//if(isFlag == true){
System.out.println(i); //执行到此步骤的都是质数
//}
//isFlag = true;
}
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long end = System.currentTimeMillis();
System.out.println("所花费的时间为:" + (end - start));
}
}
3、补充知识
3.1、衡量一个功能代码的优劣的指标
- 正确性
- 可读性
- 健壮性
- 高效率与低存储:时间复杂度 、空间复杂度 (衡量算法的好坏)
3.2、break和continue关键字的使用
使用范围 循环中使用的作用(不同点) 相同点
break: switch-case
循环结构中 结束当前循环 关键字后面不能声明执行语句
continue: 循环结构中 结束当次循环 关键字后面不能声明执行语句
补充:带标签的break和continue的使用
3.3、Scanner类的使用
要想从键盘获取不同类型的变量:需要使用Scanner类
具体实现步骤:
- 导包:import java.util.Scanner;
- Scanner的实例化:Scanner scan = new Scanner(System.in);
- 调用Scanner类的相关方法(next() / nextXxx()),来获取指定类型的变量
注意:
需要根据相应的方法,来输入指定类型的值。如果输入的数据类型与要求的类型不匹配时,会报异常:InputMisMatchException
//1.导包:import java.util.Scanner;
import java.util.Scanner;
class ScannerTest{
public static void main(String[] args){
//2.Scanner的实例化
Scanner scan = new Scanner(System.in);
//3.调用Scanner类的相关方法
System.out.println("请输入你的姓名:");
String name = scan.next();
System.out.println(name);
System.out.println("请输入你的芳龄:");
int age = scan.nextInt();
System.out.println(age);
System.out.println("请输入你的体重:");
double weight = scan.nextDouble();
System.out.println(weight);
System.out.println("你是否相中我了呢?(true/false)");
boolean isLove = scan.nextBoolean();
System.out.println(isLove);
//对于char型的获取,Scanner没有提供相关的方法。只能获取一个字符串
System.out.println("请输入你的性别:(男/女)");
String gender = scan.next();//"男"
char genderChar = gender.charAt(0);//获取索引为0位置上的字符
System.out.println(genderChar);
}
}
本文详细介绍了编程语言中的基本运算符,包括算术运算符、赋值运算符、比较运算符等,并深入探讨了逻辑运算符和位运算符的使用技巧。此外,还讲解了流程控制结构,如分支结构和循环结构的应用场景及优化方法。

被折叠的 条评论
为什么被折叠?



