java语法基础三学习笔记提纲
一、流程控制
1、顺序结构
2、分支结构
- if-else结构(三种格式) ```java //第一种格式 if(条件表达式){ 执行代码块; }
//第二种格式:二选一 if(条件表达式){ 执行代码块1; }else{ 执行代码块2; }
//第三种格式:多选一 if(条件表达式1){ 执行代码块1; }else if(条件表达式2){ 执行代码块2; }else if(条件表达式3){ 执行代码块3; } … else{ 执行代码块n; }
-
Scanner类的使用
- 第一步:导包import java.util.Scanner
- 第二步:Scanner的实例化
- 第三步:调用Scanner相关方法获取指定数据类型的变量
- **注意1**:对于char型的获取,Scanner没有提供相关的方法,只能获取一个字符串。
- **注意2**:需要根据相应的方法,来输入指定类型的值,如果输入的数据类型与要求的类型不匹配时,会报异常InputMisMatchException,导致程序终止
-
if-elseif几个注意点:
- 针对于条件表达式:如果多个条件表达式之间是“互斥”关系(或没有交集的关系),哪个判断和执行语句声明在上面还是下面,无所谓。
- 如果多个表达式之间有交集的关系,需要根据实际情况,考虑清楚应该将哪个结构声明在上面。
- 如果多个表达式之间有包含的关系,通常情况下,需要将范围小的声明在范围大的上面,否则,范围小的就没机会执行。
-
获取一个随机数
> Math.random()随机获取一个[0.0,1.0)的数
> 公式:[a,b]:(int)(Math.random()*(b-a+1))+a
-
switch-case语句
-
语法
```java
switch(表达式){
case 常量1:
执行语句1;
//break;
case 常量2:
执行语句2;
//break;
...
default:
执行语句n;
//break;
}
说明:
- 1、根据switch表达式的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句。 直到遇到break关键字或此switch-case结构末尾结束为止。
- 2、switch结构中的表达式,只能是如下的6种数据类型之一:byte、short、char、int、枚举类型(JDK5.0新增的)、String类型(JDK7.0新增的)。
- 3、case之后只能声明常量,不能声明范围。
- 4、break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构。
- 5、break语句在switch-case结构中是可选的,不是必须的。
- 6、default:相当于if-else中的else。default结构也是可选的。而且位置可以随便放,但是建议放最后面。
- 7、如果switch-case结构中的多个case的执行语句相同,则可以考虑进行合并。
- 8、凡是可以使用switch-case的结构,都可以转换为if-else,反之,不成立。
- 9、我们写分支结构时,当发现既可以使用switch-case,(同时,switch中表达式的取值情况不太多),又可以使用if-else时,我们优先选择使用switch-case。原因:switch-case执行效率稍高。
3、循环结构
循环语句的4个组成部分
- (1)初始化部分
- (2)循环条件部分:是boolean类型
- (3)循环体部分
- (4)迭代部分
for循环
- 结构:
while循环
- 结构:
for循环和while循环是可以相互转换的。区别就是for循环和while循环的初始化条件部分的作用范围不同。
do-while循环
- 结构:
- 说明:do-while循环至少会执行一次循环体。
不在循环条件部分限制次数的结构
- for(;;)或while(true)
结束循环有几种方式?
- 方式一:循环条件部分返回false
- 方式二:在循环体中,执行break
嵌套循环
练习输出九九乘法表
练习输入100以内的质数(2是最小的质数),质数(素数),只能被1和它本身整除的自然数。(面试题)
//获取开始时间的毫秒数
long startTime1 = System.currentTimeMillis();
int count1 = 0;
//方式一
for(int i=2; i <= 500000; i++) {
boolean isFlag = true;//标识i是否被除尽,一旦被除尽,修改其值。
for(int j=2; j < i; j++) {
if(i % j == 0) {
isFlag = false;
}
}
if(isFlag == true) {
count1++;
System.out.println(i);
}
//重置isFlag
isFlag = true;
}
//获取结束时间的毫秒数
long endTime1 = System.currentTimeMillis();
System.out.println("所花费时间为:"+(endTime1-startTime1));
System.out.println("质数的个数是:"+count1);
//获取开始时间的毫秒数
long startTime2 = System.currentTimeMillis();
int count2 = 0;
//质数输出的优化方式一
for(int i=2; i <= 500000; i++) {
boolean isFlag = true;//标识i是否被除尽,一旦被除尽,修改其值。
for(int j=2; j < i; j++) {
if(i % j == 0) {
isFlag = false;
break;//优化一:只对本身非质数的自然数是有效的。
}
}
if(isFlag == true) {
count2++;
System.out.println(i);
}
//重置isFlag
isFlag = true;
}
//获取结束时间的毫秒数
long endTime2 = System.currentTimeMillis();
System.out.println("所花费时间为:"+(endTime2-startTime2));
System.out.println("质数的个数是:"+count2);
//质数输出的优化方式二
//获取开始时间的毫秒数
long startTime3 = System.currentTimeMillis();
int count3 = 0;//用于记录质数的个数
for(int i=2; i <= 500000; i++) {
boolean isFlag = true;//标识i是否被除尽,一旦被除尽,修改其值。
for(int j=2; j <= Math.sqrt(i); j++) { //优化方式二:针对本身质数和非质数的自然数都有效,等号不能少
if(i % j == 0) {
isFlag = false;
break;//优化一:只对本身非质数的自然数是有效的。
}
}
if(isFlag == true) {
System.out.println(i);
count3++;
}
//重置isFlag
isFlag = true;
}
//获取结束时间的毫秒数
long endTime3 = System.currentTimeMillis();
System.out.println("所花费时间为:"+(endTime3-startTime3));
System.out.println("质数的个数是:"+count3);
//质数输出方式优化三
int count4 = 0;//用于记录质数的个数
label:for(int i=2; i <= 500000; i++) {
for(int j=2; j <= Math.sqrt(i); j++) { //优化方式二:针对本身质数和非质数的自然数都有效
if(i % j == 0) {
continue label;
}
}
count4++;
}
System.out.println("质数的个数是:"+count4);
System类的currentTimeMills方法获取当前时间的Long型时间
break关键字和continue关键字的使用
区别:1、使用范围不同:break可以使用在switch-case和循环结构中,而continue只能使用在循环结构中。2、break表示结束当前循环,continue表示结束当次循环。相同点:break和continue后面不能声明执行语句,不然会编译不通过。
break默认跳出包裹此关键字最近的一层循环。
带标签的break和continue的使用。
return:并非专门用于结束循环的,他的功能是结束一个方法,当一个方法执行到一个return语句时,这个方法将被结束。与break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。
- 项目一:家庭记账软件