Java开发之路—运算符&流程控制

本文详细介绍了编程语言中的基本运算符,包括算术运算符、赋值运算符、比较运算符等,并深入探讨了逻辑运算符和位运算符的使用技巧。此外,还讲解了流程控制结构,如分支结构和循环结构的应用场景及优化方法。

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();
执行过程:① ------ ... -

说明:

  • 开发中,基本上我们都会从forwhile中进行选择,实现循环结构
  • 区别: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);	
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值