目录

一、顺序结构

二、选择结构

2.1、if语句

2.1.1第一种结构形式:

2.1.2第二种结构形式:if else

2.1.3 第三种结构形式:

2.1.4 if-else语句和三元运算符

2.2、switch语句

三、循环结构

3.1、while循环

3.2、do while循环

3.3 for循环

3.4、死循环和循环语句对比

3.5、嵌套循环

四、控制循环结构语句

五、面试题

1、嵌套循环性能优化案例:请对以下的代码进行优化

2、要求使用嵌套循环输出成以下矩形图案

3、要求使用嵌套循环输出三角形图案

4、使用嵌套循环输出九九乘法表

5、求出100以内前5个3的倍数的数字

6、输出100~200之间不能够被3整除的数


一、顺序结构

Java程序的顺序结构:如果代码里没有流程控制,程序是按照书写的格式从上而下一行一行执行的,一条语句执行完之后继续执行下一条语句,中间没有判断和跳转,直到程序的结束

java活动选择问题 java选择结构语句题目_java活动选择问题


如果使用程序描述“如果今天是周一,就上班,如果今天是周二就逛街,如果今天是周三就去公园... ...”。

显然使用顺序结构是搞不定的。因为此时程序具有多个条件,需要通过条件判断来决定程序具体做什么,这是我们就要使用Java流程语句中的选择结构?

二、选择结构

如果使用程序描述“如果今天是周一,就上班,如果今天是周二就逛街,如果今天是周三就去公园... ...”。显然使用顺序结构是搞不定的。

因为此时程序具有多个条件,需要通过条件判断来决定程序具体做什么,那怎么办呢?

我们可以通过判断条件来做选择的语句,我们称为选择语句或分支语句。选择结构有两种:分别是if和switch。

2.1、if语句

if翻译成中文,表示如果......,就干.......,

if语句使用boolean表达式或boolean值作为选择条件,有三种结构形式:

2.1.1第一种结构形式:

if(boolean表达式){

     条件执行体

}

if后面跟的{}表示一个整体—代码块,我们在这称为条件执行体,也就是说条件为true,就执行这一块代码块。

java活动选择问题 java选择结构语句题目_if语句_02


java活动选择问题 java选择结构语句题目_开发语言_03if语句的使用注意: if

1):在if(boolean表达式)后面,{}前面是没有分号的;

java活动选择问题 java选择结构语句题目_java_04


2):如果if语句只控制一句话,那么可以不使用{}企业规范:无论if控制几句话,统统使用花括号

3):操作boolean类型的变量的时候,下列代码不专业。

java活动选择问题 java选择结构语句题目_开发语言_05


2.1.2第二种结构形式:if else

if(boolean表达式){

     条件执行体A

}else{

     条件执行体B

}

代码写法如下:

java活动选择问题 java选择结构语句题目_java活动选择问题_06


2.1.3 第三种结构形式:

if(boolean表达式A){

     条件执行体

}else if (boolean 表达式B){

     条件执行体B

}else{

     条件执行体C

}

java活动选择问题 java选择结构语句题目_java活动选择问题_07


java活动选择问题 java选择结构语句题目_开发语言_03使用注意:

1):不能在if(boolean表达式)后面使用分号;

2):不能在else if(boolean表达式)后面使用分号;

3):不能直接使用else if语句,必须先使用if语句;

4):如下的else语句,表示上述所有条件都为false的时候才会执行的代码

java活动选择问题 java选择结构语句题目_嵌套循环_09


2.1.4 if-else语句和三元运算符

从语义上二者的含义相同

从本质上说if-else是语句结构;三元运算符是一种运算符号

三元运算符必须有一个结果,表达式必须有结果,必须有返回。

而if-else,不能返回什么结果,只能控制语句的结构。

2.2、switch语句

switch语句结构的格式如下:

switch(整型表达式){
  case A值:
      表达式结果等于条件1时,执行此语句;
      break;
  case B值:
      表达式结果等于条件2时,执行此语句;
      break;
  ...
  case C值:
      表达式结果等于条件N时,执行此语句;
      break;
  default:
      以上值都不满足时,执行此语句;
      break;//一般不写
}

java活动选择问题 java选择结构语句题目_开发语言_03注意:case之后的表达式结果必须是常量。

java活动选择问题 java选择结构语句题目_java_11

  我们可以对之前输出是星期几的代码做改造

java活动选择问题 java选择结构语句题目_if语句_12

java活动选择问题 java选择结构语句题目_嵌套循环_13

java活动选择问题 java选择结构语句题目_开发语言_03 switch的使用细节和使用注意:

switch语句适用于对多个整型值进行匹配判断,从而实现条件的分支控制。

和if语句不同的是:if语句后面是根据boolean表达式判断的,所以表达式的结构可以任意写,而switch只是相当于做“表达式 == 数值”的boolean表达式判断。这里的数值的类型是除long之外的整型类型,也就是说switch支持的类型是byte、short、char、int。本质上switch仅仅只能支持int类型。(byte,short,char,会自动提升为int类型)

其实if语句更强大,switch仅仅只是对整数类型的判断而已,使用更简单。

switch语句选择的基本数据类型只有四种:byte、short、char、int,没有long。支持的引用类型是以上四个基本数据类型的包装类,依次是Byte、Short、Character、Integer以及从Java5开始支持的枚举和Java7开始支持的String类。

case只是用来为switch选择一个执行代码的入口,如果一旦进入某个入口之后,后面的case实际上已经失去了判断的意义,也就是说代码在进入switch执行的时会把入口case之后的case统统忽略,会一直往下执行,直到遇到break或return。(穿透)

所以大家可以发现,每一个case后面没有{}这个符号来表示一个代码块。

default表示,所有的case的值都不正确,一般放在switch的最后,也不需要使用break语句。

我们可以对之前判断工作日还是休息日的代码使用switch优化一下:

java活动选择问题 java选择结构语句题目_if语句_15

java活动选择问题 java选择结构语句题目_开发语言_03 注意:if和switch的选择

if和switch都属于选择语句,也就是说功能是相似的。

if:                 判断条件是boolean类型的。

switch:        判断条件是  整数表达式 == int类型的值。

switch只能适合对整数的值做判断,如果是其他类型的判断则只能使用if语句。即如果是对整数表达式判断等于多少,首选使用switch,其他情况使用if语句

三、循环结构

循环语句:可分为while语句、do while语句、for语句。三种都可以完成相同的功能,他们之间仅仅只是语法上有差异

3.1、while循环

格式:

while(boolean表达式){

        循环体

}

while循环特点:先判断表达式,若为true就执行循环体,否则,跳过循环体。如下图

java活动选择问题 java选择结构语句题目_if语句_17

 案例:叫500声帅锅,打印500次

java活动选择问题 java选择结构语句题目_if语句_18

案例:计算100以内的正整数和

java活动选择问题 java选择结构语句题目_java_19

3.2、do while循环

格式:

do{

      循环体语句

}

while(boolean表达式);

do while循环特点:先执行一次循环体,再判断表达式,若为true就执行循环体,否则,跳过循环体。也就是说do while是先执行后判断,即使判断条件为false,该循环至少会执行一次

java活动选择问题 java选择结构语句题目_嵌套循环_20

3.3 for循环

格式:

for(初始化语句;boolean表达式;循环后操作语句){

  循环体语句

}

java活动选择问题 java选择结构语句题目_嵌套循环_21

初始化语句:表示对循环进行初始化,只在循环开始时执行一次,定义一个变量,并赋值。

boolean表达式:表达式为false时,循环终止,为true,才执行循环体。

循环后操作语句:循环每次迭代之后会调用该语句,一般的该语句都是递增或递减操作。

java活动选择问题 java选择结构语句题目_if语句_22

注意:一般的情况下在for循环值的循环迭代变量起名规则最多用的循环变量名称为:i,j,k,m,n。

3.4、死循环和循环语句对比

循环语句都一样,仅仅只是语法结构上不一样而已。

提示:

三大循环是可以互换的。一般情况下要是指定次数的循环,则选用for循环要方便点。习惯上我们一般选择i、j、k作为循环变量。

从性能上分析:for循环性能更高因为变量定义在for循环里面,for循环执行完毕就会释放该变量的存储空间。

3.5、嵌套循环

循环解决的是某一个操作重复执行。如果一个重复的操作需要做N次,此时得使用嵌套循环。可以把内层循环看成是一个整体。若外循环的循环次数是m次,内循环的循环次数是n次,那么内层循环的循环次数需要 m * n次

java活动选择问题 java选择结构语句题目_开发语言_03嵌套循环注意:

内层循环和外层循环的循环控制变量不能相同。

最好采用“右缩进”格式,以体现循环层次的关系。

尽量避免太多和太深的循环嵌套结构。

     4、多重嵌套循环时,尽量把循环次数少的放在最外层循环,避免笛卡尔积的成倍增加。

四、控制循环结构语句

break:终止当前所在的循环(stop)。break之后的语句执行不了,所以不能编写。

continue: 继续的意思(skip)跳过当前的循环,进入下一次循环操作

return:表示结束循环所在的方法,方法都结束了循环结构自然也就结束了。

控制外层循环:此时就得使用标签了,标签就是给某个循环起的别名,不过该别名得满足标识符的规范。若要控制外层循环,就在break或continue后面跟上循环的别名就OK了。如: break  <标签名>; continue <标签名>;

java活动选择问题 java选择结构语句题目_java_24

java活动选择问题 java选择结构语句题目_开发语言_03注意:

  • break、continue、return后面的语句永远没有机会执行,所以不能再跟任何语句,否则编译失败。
  • break和return都能结束当前循环,如果循环之后的操作还得执行则使用break语句

五、面试题

1、嵌套循环性能优化案例:请对以下的代码进行优化

for (int i=0; i < 1000; i++)

        for (int j=0; j < 100; j++)

                for (int k=0; k < 10; k++)

                        testFunction (i, j, k);

1.1、解题思路

从上述代码案例可以看出,不论如何优化testFunction()执行的次数都是相同的,该部分是不存在优化的可能。那么优化只能从循环变量1,j,k的实例化、初始化、比较、自增等耗时方面来进行分析。首先,分析原题代码循环变量在以上方面的耗时情况:

变量

实例化(次数)

初始化(次数)

此较(次数)

自增(次数)

i

1

1

1000

1000

j

1000

1000

1000*100

1000*100

k

1000*100

1000*100

1000*100*10

1000*100*10

1.2、性能优化目的

该代码性能优化就是要尽可能地减少循环变量i、j、k的实例化、初始化、比较、自增的次数,同时不引其他可能的耗时运算。

1.3、实际解决过程

优化方案①:

for(inti=0;i<10;i+)
    for(intj=0;j<100;j++)
        for(intk=0;k<1000;k++)
            testFunction (k, j,i);

该方案主要是将循环次数少的放在外面,循环次数多的放在里层,这样可以最大程度地减少相关循环变量的实例化次数、初始化次数等。

方案耗时情况如下:

变量

实例化(次数)

初始化(次数)

此较(次数)

自增(次数)

i

1

1

10

10

j

10

10

10*100

10*100

k

10*100

10*100

10*100*1000

10*100*1000

优化方案②:

int i, j, k;
for (i= 0; i< 10; i++)
    for (j = 0;j < 100; j++)
        for(k=0;k<1000;k++)
            testFunction (k, j,i);

该方案主要是在方案①的基础上,将循环变量的实例化放在循环外,这样可以进一步减少实例化次数。

耗时情况如下表:

变量

实例化(次数)

初始化(次数)

此较(次数)

自增(次数)

i

1

1

10

10

j

1

10

10*100

10*100

k

1

10*100

10*100*1000

10*100*1000

注:方案②的优势体现在若将i、j、 k的数值提高更多的,其提升的效果才更显。

2、要求使用嵌套循环输出成以下矩形图案

***** 
***** 
*****

答案代码如下:

/**
 * @Auther: 华星详谈
 * @Description: 代码地址:https://github.com/17666555910/HuaXing-learningCenter
 *               代码路径:华星详谈学习中心 -> CodeFolder文件夹 -> Java基础 -> 流程语句篇 
 */
public class InterviewQuestions2 {
    public static void main(String[] args) {
        for (int i = 1; i <= 3; i++) {
            for (int j = 1; j <= 5; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

3、要求使用嵌套循环输出三角形图案

* 
** 
*** 
**** 
*****

答案代码如下:

/**
 * @Auther: 华星详谈
 * @Description: 代码地址:https://github.com/17666555910/HuaXing-learningCenter
 * 代码路径:华星详谈学习中心 -> CodeFolder文件夹 -> Java基础 -> 流程语句篇
 */
public class InterviewQuestions3 {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= i; j++) {
                //输出到一行中
                System.out.print("*");
            }
            //换行
            System.out.println();
        }
    }
}

4、使用嵌套循环输出九九乘法表

java活动选择问题 java选择结构语句题目_嵌套循环_26

 答案代码如下:

/**
 * @Auther: 华星详谈
 * @Description: 代码地址:https://github.com/17666555910/HuaXing-learningCenter
 * 代码路径:华星详谈学习中心 -> CodeFolder文件夹 -> Java基础 -> 流程语句篇
 */
public class InterviewQuestions4 {
    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 + "=" + (j * i) + " ");
            }
            //换行
            System.out.println();
        }
    }
}

5、求出100以内前5个3的倍数的数字

答案代码如下:

/**
 * @Auther: 华星详谈
 * @Description: 代码地址:https://github.com/17666555910/HuaXing-learningCenter
 * 代码路径:华星详谈学习中心 -> CodeFolder文件夹 -> Java基础 -> 流程语句篇
 */
public class InterviewQuestions5 {
    public static void main(String[] args) {
        int index = 0;
        for (int i = 3; i <= 100; i++) {
            if (i % 3 == 0) {
                System.out.print(i + " ");
                index++;
            }
            if (index == 5) {
                break;
            }
        }
    }
}

6、输出100~200之间不能够被3整除的数

/**
 * @Auther: 华星详谈
 * @Description: 代码地址:https://github.com/17666555910/HuaXing-learningCenter
 * 代码路径:华星详谈学习中心 -> CodeFolder文件夹 -> Java基础 -> 流程语句篇
 */
public class InterviewQuestions6 {
    public static void main(String[] args) {
        for (int i = 100; i <= 200; i++) {
            if (i % 3 == 0) {
                continue;
            }
            System.out.println(i);
        }
    }
}