Math.random(): [0.0, 1.0): 左闭右开
公式:[a, b]: (int)(Math.random() * (b - a + 1) + a)
1、if...else...
-
else:就近匹配原则。
针对条件表达式:
- 如果多个条件表达式之间是“互斥”关系(或没有交集的关系),哪个判断和执行语句声明在上面还是下面,无所谓。
- 如果多个条件表达式之间有交集的关系,需要根据实际情况,考虑清楚应该将哪个结构声明在上面。
- 如果多个条件表达式之间有包含关系,通常情况下,需要将范围小的声明在范围大的上面。否则,范围小的就没机会执行了。
2、switch-case
-
switch结构中的表达式,只能是如下的6种数据类型之一:byte、short、char、int、枚举(JDK5.0新增)、String(JDK7.0新增)。 -
case之后只能声明常量,不能声明范围。 -
default相当于if-else结构中的else。default结构是可选的,而且位置是灵活的。
说明:我们写分支结构时,当发现既可以使用
switch-case(同时,switch中表达式的取值情况不太多),又可以使用if-else时,我们优先选择使用switch-case。
原因:switch-case执行效率稍高。
3、循环结构的4个要素
① 初始化条件
② 循环条件 ---> 是boolean类型
③ 循环体
④ 迭代条件
4、for循环
-
break:跳出循环。
for (int i = 0; i <= 5; i++) {
System.out.prntln("Hello World!");
}
// i: 在for循环内有效,出了for循环就失效了。
System.out.prntln(i);
5、while循环
- 说明:写
while循环千万小心不要丢了迭代条件。一旦丢了,就可能导致死循环! -
for循环和while循环是可以相互转换的。
示例:遍历100以内的偶数
int i = 1;
while(i <= 100){
if (i % 2 === 0) {
System.out.println(i);
}
// 迭代条件
i++;
}
6、do-while
- 说明:
do-while循环至少会执行一次循环体!
示例:遍历100以内的偶数
int num = 1;
do {
if (num % 2 === 0) {
System.out.println(num);
}
// 迭代条件
i++;
} while(num <= 100);
7、无限循环
最简单的“无限”循环格式:while(true),for(;;),无限循环存在的原因是并不知道循环多少次,需要根据循环体内部某些条件,来控制循环的结束。
题目:
从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。
import java.util.Scanner;
class ForWhileTest {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
int positiveNumber = 0; // 记录正数的个数
int negativeNumber = 0; // 记录负数的个数
while (true) {
int number = scan.nextInt();
if (number > 0) {
positiveNumber++;
} else if (number < 0) {
negativeNumber++;
} else {
// 一旦执行break,跳出循环
break;
}
}
}
}
8、嵌套循环
示例:100以内的所有质数。(素数,只能被1和它本身整除的自然数。)
// 获取当前时间距离1970-01-01 00:00:00 的毫秒数
long start = System.currentTimeMillis();
boolean isFlag = true; // 标识i是否被j除尽,一旦除尽,修改其值为false。
for(int i = 2; i <= 100; i++) {
// 优化二:j < i 改成 j <= Math.sqrt(i),对本身是质数的自然数是有效的。
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j === 0) { // i被j除尽
isFlag = false;
break; // 优化一:只对本身非质数的自然数是有效的。
}
}
if (isFlag === true) {
System.out.println(i);
}
// 重置isFlag
isFlag = true;
}
// 获取当前时间距离1970-01-01 00:00:00 的毫秒数
long end= System.currentTimeMillis();
System.out.pringln("所花费的时间为:" + (end - start));
9、break和continue关键字的使用
不同点:
-
break:在循环中使用时,作用是结束当前循环。 -
continue:在循环中使用时,作用是结束当次循环。
相同点:
关键字后面不能声明执行语句。
-
break默认跳出包裹此关键字最近的一层循环。 - 带标签的
break
label: for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 10; j++) {
if (j % 4 === 0) {
break label; // 结束指定标识的一层循环结构
}
}
}
- 带标签的
continue
label: for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 10; j++) {
if (j % 4 === 0) {
continue label; // 结束指定标识的一层循环结构的当次循环
}
}
}
示例:100以内的所有质数。(素数,只能被1和它本身整除的自然数。)
int count = 0; // 统计质数的个数
// 获取当前时间距离1970-01-01 00:00:00 的毫秒数
long start = System.currentTimeMillis();
label: for(int i = 2; i <= 100; i++) {
// 优化二:j < i 改成 j <= Math.sqrt(i),对本身是质数的自然数是有效的。
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j === 0) { // i被j除尽
continue label;
}
}
// 能执行到此步骤的,都是质数
count++;
}
// 获取当前时间距离1970-01-01 00:00:00 的毫秒数
long end= System.currentTimeMillis();
System.out.pringln("所花费的时间为:" + (end - start));
10、return的使用
-
return:并非专门用于结束循环的,它的功能是结束一个方法。当一个方法执行到一个return语句时,这个方法将被结束。 - 与
break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。