if…else
public class LeapYear {
public static void main(String[] args) {
int year = 2021;
// 如果一个年份能被4整除,并且不能被100整除则是闰年
if (year % 4 == 0 && year % 100 != 0) {
System.out.println(year + "是闰年");
} else {
System.out.println(year + "不是闰年");
}
}
}
短路现象
所谓的短路现象其实就是指上面代码中 "year % 4 == 0 && year % 100 != 0"这一句中的 && ,如果前面的结果是false,那么后面的表达式就不会再执行了,因为前面已经是false了,后面的结果是true或者是false都无法改变整个表达式的结果,所以后面的就无需再执行了。
为什么要注意短路现象呢?
因为如果你意图在后面的表达式做一些逻辑运算,就可能因为短路现象而得不到执行,最终导致结果可能出乎意料。所以我们必须要了解这个问题,并进行规避。(不要在这种判断的表达式中进行逻辑运算)
do…while,while…do,for循环
其实这个也没啥特别需要说的,需要注意的就是do…while会先把循环体先执行一次,然后再进行条件判断,而while…do则是先判断,判定为true才会执行一次循环体。
for循环现在有更进一步简化的表达,例如 for item:items ,或者是:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("test");
list.forEach(item -> {
System.out.println(item);
});
}
但需要注意,在使用以上for循环形式遍历对象列表时,需要先进行判空,否则会产生空指针异常。
另一个我们需要关注的问题就是如果跳出循环体流程,除了循环体外面的判断,我们经常也需要在循环体内部中断代码执行,一般分为两种情况:
- 跳出当前次的循环:那么我们就使用continue,这样就会执行下次轮回。
- 直接跳出整个循环体:那么我们可以使用return,这样就会跳出整个循环体,返回主流程。
但需要额外注意,forEach循环是无法直接退出整个循环的:
public static void main(String[] args) {
List<String> loopTest = new ArrayList<>();
loopTest.add("loop1");
loopTest.add("loop2");
loopTest.add("loop3");
// 要考虑好场景再使用下面的循环方式
loopTest.forEach(item -> {
System.out.println(item);
return ;
});
System.out.println("loop end");
/**
* 实际输出:
* loop1
* loop2
* loop3
* loop end
*/
}
switch&break&default
switch一般在仅有固定几个分支的时候使用,也就是使用在简单的逻辑分支场景下,所以它一般只支持byte, short , char, int,但是在jdk7之后,它就支持了String,但实际上switch中的值都是转换为整型之后进行比较的。当使用的对象是char时,使用对应的ascii码,而String对象则是使用对应的hashCode。
当我们使用switch时,必须要注意的它什么时候中断流程,当switch匹配了值之后,并不会立刻返回的,而是需要再遇到一个break,然后才中断返回结果的。如果你忘记在流程中加入break,就可能导致代码的结果出乎意料。
例如:
public static void main(String[] args) {
char grade = 'A';
switch (grade) {
case 'A':
System.out.println("Your grade is A");
case 'B':
System.out.println("Your grade is B");
break;
case 'C':
System.out.println("Your grade is C");
break;
default:
System.out.println("Your are fail");
}
}
你的期望结果是输出:
Your grade is A
但是实际的输出结果确实:
Your grade is A
Your grade is B
而default则通常作为兜底结果,虽然不加没问题,但是实际编程中最好还是加上,防止出现意料之后的结果,但是又不知道走到了什么逻辑分支。