流程控制包括if条件判断、switch选择、while循环、do-while循环、for循环等。
输入与输出
输出
使用System.out.println()来向屏幕输出一些内容。
println是print line的缩写,表示输出并换行。因此不想换行,可以用print()
格式化输出
格式化输出使用System.out.printf(),通过使用占位符%?,printf()可以把后面的参数格式化成指定格式:
1 | public class Main { |
Java的格式化功能提供了多种占位符,可以把各种数据类型“格式化”成指定的字符串:
占位符 | 说明 |
---|---|
%d | 格式化输出整数 |
%x | 格式化输出十六进制整数 |
%f | 格式化输出浮点数 |
%e | 格式化输出科学计数法表示的浮点数 |
%s | 格式化字符串 |
注意,由于%表示占位符,因此,连续两个%%表示一个%字符本身。 |
详细的格式化参数请参考JDK文档java.util.Formatter
输入
- 首先,我们通过import语句导入java.util.Scanner,import是导入某个类的语句,必须放到Java源代码的开头,后面我们在Java的package中会详细讲解如何使用import。
- 然后,创建Scanner对象并传入System.in。System.out代表标准输出流,而System.in代表标准输入流。直接使用System.in读取用户输入虽然是可以的,但需要更复杂的代码,而通过Scanner就可以简化后续的代码。
- 有了Scanner对象后,要读取用户输入的字符串,使用scanner.nextLine(),要读取用户输入的整数,使用scanner.nextInt()。Scanner会自动转换数据类型,因此不必手动转换。
1 | import java.util.Scanner; |
条件判断
if – else if – else
1 | public class Main { |
浮点数判等
浮点数在计算机中常常无法精确表示,并且计算可能出现误差,因此,判断浮点数相等用==判断不靠谱,正确的方法是利用差值小于某个临界值来判断:
1 | public class Main { |
引用类型判等
在Java中,判断值类型的变量是否相等,可以使用==运算符。但是,判断引用类型的变量是否相等,==表示“引用是否相等”,或者说,是否指向同一个对象。
例如,下面的两个String类型,它们的内容是相同的,但是,分别指向不同的对象,用==判断,结果为false:
1 | public class Main { |
判断引用类型的变量内容是否相等,必须使用equals()方法:
1 | public class Main { |
执行语句s1.equals(s2)时,如果变量s1为null,会报NullPointerException
避免NullPointerException错误
- 利用&&
1
2
3
4
5
6
7
8public class Main {
public static void main(String[] args) {
String s1 = null;
if (s1 != null && s1.equals("hello")) {
System.out.println("hello");
}
}
} - 把一定不是null的对象”hello”放到前面:例如:if (“hello”.equals(s)) { … }。
小结
不推荐省略花括号{};
多个if … else串联要特别注意判断顺序;
要注意if的边界条件;
要注意浮点数判断相等不能直接用==运算符;
引用类型判断内容相等要使用equals(),注意避免NullPointerException。
switch多重选择
switch语法
switch语句根据switch (表达式)计算的结果,跳转到匹配的case结果,然后继续执行后续语句,直到遇到break结束执行。
对于多个==判断的情况,使用switch结构更加清晰。
使用switch时,注意case语句并没有花括号{},而且,case语句具有“穿透性”,漏写break将导致意想不到的结果
1 | switch (option) { |
编译检查
使用IDE时,可以自动检查是否漏写了break语句和default语句,方法是打开IDE的编译检查。
在Eclipse中,选择Preferences - Java - Compiler - Errors/Warnings - Potential programming problems,将以下检查标记为Warning:
‘switch’ is missing ‘default’ case
‘switch’ case fall-through
在Idea中,选择Preferences - Editor - Inspections - Java - Control flow issues,将以下检查标记为Warning:
Fallthrough in ‘switch’ statement
‘switch’ statement without ‘default’ branch
当switch语句存在问题时,即可在IDE中获得警告提示。
小结
switch语句可以做多重选择,然后执行匹配的case语句后续代码;
switch的计算结果必须是整型、字符串或枚举类型;
注意千万不要漏写break,建议打开fall-through警告;
总是写上default,建议打开missing default警告;
从Java 12开始,switch语句升级为表达式,不再需要break,并且代码更简洁。
while循环
基本语法
1 | while (条件表达式) { |
do-while循环
基本语法
1 | do { |
do-while循环会至少循环一次。
for循环
基本语法
1 | for (初始条件; 循环检测条件; 循环后更新计数器) { |
for each循环
和for循环相比,for each循环的变量n不再是计数器,而是直接对应到数组的每个元素。for each循环的写法也更简洁。但是,for each循环无法指定遍历顺序,也无法获取数组的索引。
除了数组外,for each循环能够遍历所有“可迭代”的数据类型,包括List、Map等。
1 | public class Main { |
小结
for循环通过计数器可以实现复杂循环,
for each循环可以直接遍历数组的每个元素。
break和continue
break
break语句总是跳出自己所在的那一层循环
continue
break会跳出当前循环,而continue提前结束本次循环,continue后的语句均不执行,直接继续执行下次循环。