文章目录
1 Scanner
对象
java.util.Scanner
是Java5的新特性,可以通过Scanner
类获取用户的输入
// 创建一个扫描器对象,用于接收键盘数据
Scanner sc = new Scanner(System.in);
// 判断用户有没有输入字符串
if(sc.hasNext()) {
// 使用next方法接收
String str = sc.next();
System.out.println(str);
}
// 凡是属于IO流的类如果不关闭会一直占用资源,要养成好习惯用完就关掉
sc.close();
可以通过Scanner
类的next()
和nextLine()
方法获取输入的字符串,在读取前一般需要使用hasNext()
和hasNextLine()
判断是否还有输入的内容
next()
:- 一定要读取到有效字符后才可以结束输入
- 对输入有效字符之前遇到的空白,
next()
方法会自动将其去掉 - 只有输入有效字符后才将其后面输入的空白作为分隔符或结束符
next()
不能得到带有空格的字符串- 在键盘输入
Hello World
,并按下回车时,next()
方法只会获得Hello
nextLine()
:- 以Enter作为结束符,即
nextLine()
方法返回输入回车之前的所有字符 - 可以获得空白
- 在键盘输入
Hello World
,并按下回车时,nextLine()
方法会完整获得Hello World
这条数据
- 以Enter作为结束符,即
对于其他数据类型同样可以使用
Scanner
类进行接收,只需使用对应的方法,例如:nextInt()
、nextFloat()
、nextDouble()
等
2 顺序结构
Java最基本的结构就是顺序结构,除非特别指明,否则就按照顺序逐句执行。顺序结构是最简单的算法结构,其中语句和语句之间,框与框之间按照从上到下的顺序进行,它是由若干个依次执行的处理步骤组成的,是任何一个算法都离不开的一种基本算法结构
3 if选择结构
3.1 if单选择结构
在程序中的很多时候需要判断一个东西是否可行,然后再去执行,此过程可表示为:
if (布尔表达式) {
// 如果布尔表达式为true时将执行的语句
}
3.2 if双选择结构
对于同一个判断条件而言,其真假可能会产生不同的后果,因此可以使用if-else这样的双选择结构
if (布尔表达式) {
// 如果布尔表达式的值为true
} else {
// 如果布尔表达式的值为false
}
3.3 if多选择结构
真实的情况中还可能存在区间多级判断,在生活中很多时候的选择也不止有两个,所以需要一个多选择结构
if (布尔表达式1) {
// 如果布尔表达式1的值为true执行代码
} else if (布尔表达式2) {
// 如果布尔表达式2的值为true执行代码
} else if (布尔表达式3) {
// 如果布尔表达式3的值为true执行代码
} else {
// 如果以上布尔表达式都不为true执行代码
}
- if语句中至多有一个else语句,else语句在所有的else if语句之后
- if语句可以有若干个else if语句,它们必须在else语句之前
- 一旦其中一个else if语句检测为true,其他的else if以及else语句都将跳过执行
3.4 嵌套的if结构
使用嵌套的if-else语句是合法的,即可以在另一个if或者else if语句中使用if或else if语句
if (布尔表达式1) {
// 如果布尔表达式1的值为true执行代码
if (布尔表达式2) {
// 如果布尔表达式2的值为true执行代码
}
}
4 switch多选择结构
-
switch case语句用于判断一个变量与一系列值中某个值是否相等,每个值称为一个分支
switch (expression) { case value: // 语句 break; // 可选 case value: // 语句 break; // 可选 // 可以有任意数量的case语句 default: // 上述都不匹配时执行,可选 // 语句 }
-
switch语句存在case穿透现象,如果没有添加
break
语句,程序就会从匹配成功处一直向下执行,直到全部语句执行完毕或者遇到一个break
char grade = 'B'; switch (grade) { case 'A': System.out.println("优秀"); case 'B': System.out.println("良好"); case 'C': System.out.println("及格"); case 'D': System.out.println("不及格"); default: System.out.println("非法输入"); }
上述程序输出结果为:
良好 及格 不及格 非法输入
在第三个分支处添加
break
switch (grade) { case 'A': System.out.println("优秀"); case 'B': System.out.println("良好"); case 'C': System.out.println("及格"); break; case 'D': System.out.println("不及格"); default: System.out.println("非法输入"); }
此时输入结果为:
良好 及格
所以,除非程序就是需要实现一个结果叠加的效果,最好在每个
case
语句后添加break
-
switch语句中的变量类型可以是:
byte
、short
、int
、char
,从Java7开始,支持字符串String
类型;同时case标签必须为字符串常量或字面量通过IDEA的反编译功能可以知道switch支持
String
类型的原理,有如下程序:public static void main(String[] args) { String skill = "编程"; switch (skill) { case "搬砖": System.out.println("我的技能是搬砖"); break; case "编程": System.out.println("我的技能是编程"); break; case "摸鱼": System.out.println("我的技能是摸鱼"); break; default: System.out.println("我木有技能"); } }
通过IDEA的Project Structure可以查看项目编译后输出目录:
将生成的.class文件复制到项目文件夹中,就可以通过IDEA对字节码文件进行反编译,反编译的结果如下:
public static void main(String[] args) { String skill = "编程"; byte var3 = -1; switch(skill.hashCode()) { case 825706: if (skill.equals("搬砖")) { var3 = 0; } break; case 837380: if (skill.equals("摸鱼")) { var3 = 2; } break; case 1039797: if (skill.equals("编程")) { var3 = 1; } } switch(var3) { case 0: System.out.println("我的技能是搬砖"); break; case 1: System.out.println("我的技能是编程"); break; case 2: System.out.println("我的技能是摸鱼"); break; default: System.out.println("我木有技能"); } }
由此可见,switch语句是通过判断
String
字符串的hashCode
值是否相等实现多选择功能
5 while循环结构
-
while是最基本的循环,其结构为:
while (布尔表达式) { // 循环内容 }
-
只要布尔表达式为true,循环就会一直执行下去
-
大多数情况下会让循环停止,则需要一个让表达式失效的方式来结束循环
-
少部分情况需要循环一直执行,比如服务器的请求响应监听等
-
循环条件一直为true就会造成无限循环(死循环),在正常的业务编程中应该尽量避免死循环,避免影响程序性能或造成程序卡死崩溃等情况的发生
6 do-while循环
-
对于while语句而言,如果不满足条件,则不仅如此循环。但有时存在即使不满足条件也至少执行一次语句的需求
-
do-while循环和while循环类似,不同点在于do-while循环会至少执行一次
do { // 代码语句 } while (布尔表达式);
-
while循环先判断后执行,do-while循环先执行后判断
7 for循环
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构;for循环执行的次数在执行前就确定的
for (初始化;布尔表达式;更新) {
// 代码语句
}
- 最先执行初始化步骤,可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句
- 初始化后检测布尔表达式的值,如果为true,循环体被执行;如果为false,循环终止,开始执行循环体后面的语句
- 执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)
- 再次检测布尔表达式,循环执行上述过程
7.1 练习1:计算0到100之间奇数和偶数的和
public static void main(String[] args) {
int oddSun = 0;
int evenSum = 0;
for (int i = 0; i <= 100; i++) {
if (i % 2 != 0) { // 奇数
oddSum += i;
} else { // 偶数
evenSum += i;
}
}
System.out.println("奇数的和:" + oddSum);
System.out.println("偶数的和:" + oddSum);
}
7.2 练习2:用for循环输出1到1000之间能被5整除的数,且每行输出3个
public static void main(String[] args) {
for (int i = 1; i <= 1000; i++) {
if (i % 5 == 0) {
System.out.print(i + "\t");
}
if (i % (5 * 3) == 0) {
System.out.println();
}
}
}
7.3 练习3:打印九九乘法表
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + i * j + "\t");
}
System.out.println();
}
}
8 增强for循环
Java5中引入的一种主要用于数组或集合的增强型for循环
for (声明语句:表达式) {
// 代码语句
}
- 声明语句用于声明新的局部变量,该变量的类型必须和数组元素的类型匹配,其作用域限定在循环语句块内部,值与此事数组或集合中元素的值相等
- 表达式是要访问的数组名或集合名,或者是返回值为数组或集合的方法
9 break、continue、goto
-
在任何循环语句的主体部分,均可用break控制循环的流程,break用于强行退出循环,不执行循环中剩余的语句。(switch语句中也使用break)
-
continue语句用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定
-
goto
关键字是Java中的一个保留字,但未在语言中得到正式使用,可以说Java中没有goto
-
在多层循环中,break和continue只能跳出它所在的那一层循环,如果想要实现跳出多层循环,可以使用带标签的break和continue语句:
flag: // 标签 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.println(j); if (j == 5) break flag; // 此处的break会直接跳出两层循环到外部 } }
-
利用带标签的break和continue语句,可以任意跳出循环到达标签处位置,变相实现
goto
关键字的功能