您的位置 首页 java

Java流程控制语句

Java流程控制语句简介

Java流程控制语句一共有三种:顺序结构、分支结构、循环结构。

一、顺序结构

顺序结构是程序中最简单最基本的流程控制,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。

二、分支结构(选择结构)

条件语句可根据不同的条件执行不同的语句。包括if条件语句、switch多分支语句、三元表达式。

  • 2.1 if分支结构

格式:

if(条件表达式){

执行的代码块;

}

关系表达式的结果如果是true就执行语句体,如果是false就不执行语句体。

  • 2.2 if-else分支结构

格式:

if(条件表达式){

执行的代码块1;

}else{

执行的代码块2;

}

关系表达式的结果如果是true就执行语句体1,如果是false就执行语句体2。

  • 2.3 if-else if -else分支结构

格式:

if(条件表达式){

执行的代码块1;

}else if(条件表达式){

执行的代码块2;

}…(此处省略N个else if)

else{

执行代码块N +1;

}

先判断关系表达式1的结果,如果是true就执行语句体1

如果是false就继续判断关系表达式2的结果是true还是false

如果是true就执行语句体2

如果是false就继续判断关系表达式…看其结果是true还是false

如果没有任何关系表达式为true,就执行语句体n+1。

  • 2.4 switch-case分支结构

格式:

switch-case使用注意点:

  1. switch的条件表达式的返回值只能是byte、short、int、char、string、枚举这六种类型。
  2. case子句中的值必须是常量,且所有case子句中的值应是不同的,case后面不能放变量, 因为系统在编译的时候会对switch后面所以的case进行优化,会根据case后面的常量值,生成一张取值表。
  3. default子句的位置是可任选的,无论的default写到什么地方,它都会最后执行(只有前面所以的case都不满足的情况才会执行)
  4. 只要某一个case满足,那么后面所以的case和default都会失效。
  5. 判断值是一个区间或者布尔类型时,适合使用if语句。判断的值是少数的几个常量可以使用switch。
  6. break 语句用来在执行完一个case分支后使程序跳出swich语句块; 如果没有break程序会按照顺序执行到swich结尾(case穿透);

三、 循环结构

循环语句 就是在满足一定条件的情况下反复执行某一个操作。包括while循环语句、do while循环语句、for循环语句、 Foreach 循环语句。

  • 2.1 while循环结构

格式:

初始化语句;

while(判断条件语句) {

循环体语句;

控制条件语句;

}

while循环语句的循环方式为利用一个条件来控制是否要继续反复执行这个语句。

  • 2.2 do while循环结构

格式:

初始化语句;

do {

循环体语句;

控制条件语句;

} while(判断条件语句);

  • 2.3 for循环 结构

格式:

for(初始化语句;判断条件语句; 控制条件语句) {

循环体语句;

}

  • 2.4 for each循环结构

格式:

for (声明语句 : 表达式) {

  //代码句子

}

四、跳转语句

Java 语言中提供了3种跳转语句,分别是break语句、continue语句和return语句。

  1. return :直接结束当前的方法
  2. break :

在switch语句中的作用:跳出当前switch结构

循环体中的作用:跳出当前循环

  1. continue:跳出当前循环的当初循环,继续下一次循环
  2. goto:

goto 起源于汇编语言的程序,是Java的一个保留字(目前被保留起来,还未使),java中没有goto语句的使用,现在是以break+标签,continue+标签的形式来代替goto。

Java中的标签就是一个紧跟着“:”的标识符,用在迭代语句外层。

break+标签:跳出标签所处的循环

continue+标签:跳出标签所处的循环的当次循环,继续下一次循环

五、小结:

  1. While和do-While的区别:

while先判断后执行,do…while是先执行后判断

do while 总是保证循环体会被至少执行一次,这是它和while的主要差别。

  1. 死循环主要用在单线程监听上。
  2. for循环语句和while循环语句的区别:

控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。 原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。

  1. for循环和foreach循环的区别:
  2. foreach 循环是for循环的增强,写法简单。
  3. 在遍历时需要使用元素的index时不能使用foreach。
  4. foreach不可以删除/新增集合元素,而for可以。
  5. 对ArrayList集合数组结构,for比foreach效率高。对LinkedList集合链表结构,foreach比for语句效率快很多倍。
  6. Foreach只能用于数组和集合的遍历,而for则可以用于其他用途。

六、问题思考

  1. foreach不可以删除/新增集合元素,而for可以?

这是因为foreach的底层原理使用的是itrator迭代器。 迭代器 是一个单向指针,主要有两个方法,一个是hasNext,一个是next。

A.通过hasNext判断边界,是否可以继续迭代
B.通过next() 方法返回指针指向的对象

public interface Iterator <E> {

boolean hasNext();//判断边界,是否还有下一个对象,即是否还能迭代

E next(); //返回下一个对象

}

在使用foreach遍历集合或者数组时,底层会生成一个iterator迭代器,这个迭代器指针只会单向移动,在expectedModCount初始化的时候是等于modCount的,相当于版本号,然后next方法调用时每次都会检查下这两个值是否相等,(这里相当于一个乐观锁的结构)。

而Arraylist和LinkedList的remove和add方法被调用进行删除或者新增元素时,都会进行modCount++,相当于每次删除或者新增,modCount这个版本值都会加1,导致调用next方法时两值不一样,就会报ConcurrentModificationException异常。

迭代器代码源码:

  1. foreach和for的效率比较?

对于ArrayList集合数组结构,for比foreach效率稍高。对于LinkedList集合链表结构,foreach比for语句效率快很多倍。

因为ArrayList集合属于数组结构,在内存是有序地排列,每个元素有自己的序号,可以通过索引进行快速定位。而LinkedList集合属于链表结构,每个元素都只指向下级元素的地址。

数组结构的循环,for会比foreach稍快,是因为for直接通过i索引进行快速定位元素,而foreach则是通过iterator进行单向遍历,每次查找元素都需要调用hashNext和next方法一次,查找到一个元素需要两步,所以在遍历ArrayList数组结构的集合时,for会稍微foreach稍微快一些。

链表 结构的循环,foreach会比for快很多倍,是因为fori在遍历链表结果时,通过索引查找元素时,元素不能直接通过索引查找,只能通过上级找下级的方式寻找元素,每次遍历都是从头开始找,直到找到正确元素为止。而foreach则还是通过iterator进行单向遍历,每次查找元素依然是调用hashNext和next方法一次,所以对于元素大小为N的数组,链表结构的集合,for需要从头遍历N次,而foreach只需要遍历一次,所以在遍历linkedlist链表集合时,foreach会比for效率高很多。

PS:创作不易,请点个赞吧!喜欢作者的可点一波关注,感谢老铁!

文章来源:智云一二三科技

文章标题:Java流程控制语句

文章地址:https://www.zhihuclub.com/168868.shtml

关于作者: 智云科技

热门文章

网站地图