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则是先判断,判定为true才会执行一次循环体。
for循环现在有更进一步简化的表达,例如 for item:items ,或者是:
public static void main(String[] args) { Listlist = new ArrayList<>(); list.add("test"); list.forEach(item -> { System.out.println(item); }); }
但需要注意,在使用以上for循环形式遍历对象列表时,需要先进行判空,否则会产生空指针异常。
另一个我们需要关注的问题就是如果跳出循环体流程,除了循环体外面的判断,我们经常也需要在循环体内部中断代码执行,一般分为两种情况:
- 跳出当前次的循环:那么我们就使用continue,这样就会执行下次轮回。
- 直接跳出整个循环体:那么我们可以使用return,这样就会跳出整个循环体,返回主流程。
但需要额外注意,forEach循环是无法直接退出整个循环的:
public static void main(String[] args) { Listswitch&break&defaultloopTest = new ArrayList<>(); loopTest.add("loop1"); loopTest.add("loop2"); loopTest.add("loop3"); // 要考虑好场景再使用下面的循环方式 loopTest.forEach(item -> { System.out.println(item); return ; }); System.out.println("loop end"); }
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则通常作为兜底结果,虽然不加没问题,但是实际编程中最好还是加上,防止出现意料之后的结果,但是又不知道走到了什么逻辑分支。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)