Java架构师成长之道之Java程序流程控制



Java架构师成长之道





4.1 程序流程控制概述

之前编写的绝大多数程序都是顺序执行,也就是从main函数开始,由上到下一行一行的执行,也被称为顺序结构。

java 可以控制系统音量 java程序控制_System


在生活中除了顺序结构以外还有选择结构、循环结构,例如在淘宝购物时登录账号就是一个选择结构,如果输入的正确的用户名和密码才能购买商品,否则就会提示用户名密码错误。

而在淘宝首页的Banner就是一个循环结构,在指定的时间内循环切换图片。

在Java中,支持if/else和switch case两种选择结构,同时支持while,do...while,for循环以及JDK1.5以后支持foreach循环,同时还支持带标签的循环结构以及通过使用break,continue来中断循环。



4.2 使用Scanner类实现程序交互

平常在使用PC浏览电商网站时,如果想要购买商品通常需要输入用户名和密码来登录系统。

而登录的目的正是验证账号的合法性,在Java中可以使用Scanner类来模拟用户的输入数据,

可以读取的数据类型是boolean,byte,short,int,long,String,double等等,可以通过IDEA的Structure视图查看Scanner类的源码支持读取的类型。

java 可以控制系统音量 java程序控制_java_02

在Java程序中如果想要使用一个类,必须使用import关键字加上类的包名+类名+分号实现


import java.util.Scanner;

Java默认为所有的源文件导入java.lang包下的类,因此在之前编写的Java程序中使用的String,System等类无需使用import导入。

Java开发中常用的包还有util,io,nio,text,time等等。同学们有时间可以多去看看这些包下的源码实现,提升自己的编程功底。

java 可以控制系统音量 java程序控制_System_03

在导入之后便可以通过new关键字创建Scanner对象来模拟键盘,
同时在Scanner构造器中传入System.in作为数据的来源,表示来源于控制台


Scanner input =new Scanner(System.in);


使用Scanner读取用户信息并输出到控制台


package net.ittimeline.java.core.control;

import java.util.Scanner;

/**
 * 读取用户输入数据实现程序交互
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 17:49
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class ScannerTest {

    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        System.out.println("请输入你的年龄");
        int age=input.nextInt();

        System.out.println("请输入你的身高");
        double height=input.nextDouble();

        System.out.println("请输入你的姓名");
        String name=input.next();

        System.out.println("你是男生么?");
        boolean genderFlag=input.nextBoolean()?Boolean.TRUE:Boolean.FALSE;

        if(genderFlag){
            System.out.printf("你的年龄是%d,你的姓名是%s,你的性别是男生,你的身高是%.2f",age,name,height);
        }
        else{
            System.out.printf("你的年龄是%d,你的姓名是%s,你的性别是女生,你的身高是%.2f",age,name,height);

        }
    }
}


java 可以控制系统音量 java程序控制_System_04

交互效果

关于Scanner类的更多介绍以及使用方式,可以查阅JDK的API文档

java 可以控制系统音量 java程序控制_System_05



4.3 自定义PrintUtils类

PrintUtils类位于java-core-util模块中,使用Maven管理项目,关于Maven和IntelliJ IDEA的使用后面会详细介绍


java 可以控制系统音量 java程序控制_选择结构_06

工程模块总览以及PrintUtils概览


该类主要是对于System类的PrintStream对象封装,结合JDK1.5的静态导入特性,可以实现更加"简洁的数据输出",方便程序调试。

如果想要在其他模块引用该类,只需要在其他模块的pom.xml文件中添加该类所有在模块的坐标即可


<dependency>
            <groupId>net.ittimeline.java</groupId>
            <artifactId>java-core-util</artifactId>
            <version>${project.version}</version>
        </dependency>


package net.ittimeline.java.core.util.lang;

/**
 * 控制台打印输出工具类
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-02 11:53
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class PrintUtils {


    /**
     * 打印输出对象的内容并换行
     * @param object
     */
    public static void println(Object object){
        System.out.println(object);
    }
    /**
     * 打印输出对象们的内容并换行
     * @param objects
     */
    public static void println(Object...objects){
        for (Object object:objects){
            println(object);
        }
    }



    /**
     * 打印分割
     */
    public static  void println(){
        System.out.println();
        System.out.println("*********************楚河汉界*********************");
    }

    /**
     * 打印输出对象的内容不换行
     * @param object
     */
    public static void print(Object object){
        System.out.print(object);
    }

    /**
     * 按照指定的格式打印输出内容
     * @param format
     * @param args
     */
    public static void printf(String format,Object...args){
        System.out.printf(format,args);
    }
}



4.4 选择结构if/else

if/else用于布尔类型的变量或者表达式作为条件判断来进行程序流程控制,if/else语句有如下三种形式

if语句,也被称为单分支选择结构


java 可以控制系统音量 java程序控制_java 可以控制系统音量_07

单分支选择


if(true){
    //执行代码块的内容
}


使用Math.random()方法随机生成1-6的整数,然后判断大小


package net.ittimeline.java.core.control;
import static java.lang.System.out;
/**
 * if单选择结构
 *
 * if(true){
 *
 * }
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-04 10:27
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class Lottery {

    public static void main(String[] args) {

        //返回一个0.0-1.0(不包含1.0)之间的小数
        double dbl=Math.random();
        out.println("dbl ="+dbl);

        //产生1-6之间的随机数
        int number=(int)(dbl*6)+1;
        out.println("number = "+number);

        int target=3;
        if(number<=target){
            out.println("小");
        }


    }
}


使用Math.random()随机生成1-6的3个整数,判断手气


package net.ittimeline.java.core.control;
import static java.lang.System.out;
/**
 * 单if选择结构
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-04 10:33
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class Lottery2 {

    public static void main(String[] args) {
        double dbl=Math.random();
         int i,j,k;
         //创建三个1-6之间的随机整数数
         i = (int)(dbl*6)+1;
         j = (int)(dbl*6)+1;
         k = (int)(dbl*6)+1;


        out.println("i = "+i +" j = "+j +" k = "+k );


         //求三个随机数的和
         int point=i+j+k;

        out.println("point  = "+point);

        //根据随机数的和判断输出的内容
         if(point>15){
             out.println("今天手气很不错");
         }

         //只要满足if的bool表达式,就会执行代码块{}中的内容
         if(point>=10&&point<=15){
             out.println("今天手气一般");
         }
         if(point<10){
             out.println("今天手气不好");
         }

    }
}


if/else语句(二选一),也别称为双分支选择结构


java 可以控制系统音量 java程序控制_java 可以控制系统音量_08

双分支选择结构


if(true){
    //执行代码块的内容
}
else{
    //执行代码块的内容
}


使用Math.random()产生1-6之间的随机整数,判断大小


package net.ittimeline.java.core.control;
import static java.lang.System.out;

/**
 * if/else择结构
 *
 * if(true){
 *
 * }
 * else{
 *
 * }
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-04 10:27
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class Lottery3 {

    public static void main(String[] args) {

        //返回一个0.0-1.0(不包含1.0)之间的小数
        double dbl=Math.random();
        out.println("dbl ="+dbl);

        //产生1-6之间的随机数
        int number=(int)(dbl*6)+1;
        out.println("number = "+number);

        int target=3;
        if(number<=target){
            out.println("小");
        }
        else{
            out.println("大");
        }


    }
}


判断用户输入的年份是否是闰年


package net.ittimeline.java.core.control.ifstatement;

import java.util.Scanner;

/**
 * 判断用户输入的年份是不是闰年
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-04 17:58
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class LeapYearCheck {

    public static void main(String[] args) {
        //创建虚拟键盘
        Scanner input =new Scanner(System.in);
        System.out.println("请输入年份");
        int year=input.nextInt();
        /**
         * 闰年判断的公式
         * 年份能被4整除不能被100整除 或者 年份不能被400整除
         * 
         * 2016 2020 都是闰年
         */
        boolean flag=(year%4==0&&year%100!=0)||year%400==0;
        if(flag){
            System.out.printf("你输入的年份%d是闰年",year);
        }
        else{
            System.out.printf("你输入的年份%d不是闰年",year);
        }


    }
}


使用if/else模拟淘宝登录


package net.ittimeline.java.core.control.ifstatement;


import java.util.Scanner;

/**
 * 模拟淘宝登录
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-04 18:09
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class TaobaoLogin {

    public static void main(String[] args) {
        Scanner input =new Scanner(System.in);


        System.out.println("请输入你的用户名");
        String name =input.next();
        System.out.println("请输入你的密码");
        String password=input.next();

        String targetName="tony";
        String targetPassword="123456";

        if(targetName.equals(name)&&targetPassword.equals(password)){
            System.out.println("欢迎登录淘宝");
        }
        else{
            System.out.println("用户名或者密码输入错误,请检查");
        }


    }
}

用户名或者密码输入正确的运行结果

java 可以控制系统音量 java程序控制_java 可以控制系统音量_09

if/else if /else(多选一)

java 可以控制系统音量 java程序控制_System_10


if(true){
    //执行代码块的内容
}
else if(true){
    //执行代码块的内容
}
else if(true){
    //执行代码块的内容
}
else{
    //执行代码块的内容
}


根据随机生成的年龄判断是青少年、中年、还是老年人


package net.ittimeline.java.core.control;

import java.util.Random;

/**
 * 年龄判断
 * if(){
 *
 * }
 * else if(){
 *
 * }
 * else{
 *
 * }
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-04 12:27
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class Age {

    public static void main(String[] args) {
        Random random=new Random();
        int age=random.nextInt(110)+1;
        System.out.println("age = "+age);
        if(age<=6){
            System.out.println("你是儿童");
        }
        else if(age>=7&&age<=14){
            System.out.println("你是少年");

        }
        else if(age>=15&&age<=35){
            System.out.println("你是青年人");
        }
        else if(age>=36&&age<=60){
            System.out.println("你是中年人");
        }
        else if(age>60){
            System.out.println("你是老年人");

        }
        else{
            System.out.println("无法识别你的年龄");
        }
    }
}


比较两个数的大小,如果大于返回1,小于返回-1,等于返回0


package net.ittimeline.java.core.control;
import static java.lang.System.out;

/**
 * if(){
 *     
 * }
 * else if(){
 *     
 * }
 * else{
 *     
 * }
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-02 11:43
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class IfElseIfElse {

    /**
     * 多选一
     * 用于比较两个数的大小
     * if/else if /else
     * @param testval
     * @param target
     * @return
     */
    static int test(int testval,int target){
        if(testval>target){
            return +1;
        }
        else if(testval<target){
            return -1;

        }
        else{
            return 0;
        }
    }

    public static void main(String[] args) {
        out.println(test(10,5));
        out.println(test(5,10));
        out.println(test(5,5));

    }
}


使用if/else if/else模拟相亲现场


package net.ittimeline.java.core.control.ifstatement;

import java.util.Scanner;

/**
 * 相亲现场
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-04 22:55
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class Marry {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("请输入你的身高:(cm)");
        int height = input.nextInt();

        System.out.println("请输入你的财富:(千万)");
        double wealth = input.nextDouble();

        System.out.println("请输入你是否帅:(true/false)");
        boolean isHandsome = input.nextBoolean();


        //三个条件全满足
        if (height >= 180 && wealth >= 1 && isHandsome) {
            System.out.println("我一定要嫁给他!!");
        }
        //三个满足一个
        else if (height > 180 || wealth >= 1 || isHandsome) {
            System.out.println("嫁吧,比上不足比下有余");
        }
        //一个都不满足
        else {
            System.out.println("不嫁");
        }
    }
}


在进行复杂业务开发时,还会使用到嵌套的if/else


if(true){
    if(true){
        //执行代码块
        }
    else{
        //执行代码块
    }
}
else{
    //执行代码块
}


使用嵌套if和三元运算符求出三个整数的最大值


package net.ittimeline.java.core.operator.ternary;

/**
 * 求三个数中的最大值
 * 分别使用if/else if和三元运算符
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-04 16:58
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class GetMaxNumber {

    public static void main(String[] args) {

        int i=277;
        int j=20;
        int k=-99;

        int max=0;
        if(i>j){
            if(i>k){
                max=i;
            }
            else{
                max=k;
            }
        }

        System.out.println("使用if/else if实现求三个整数的最大值 max = "+max);

        max= i>j&&i>k?i:k;

        System.out.println("三个数中的最大值是"+max);
    }
}


使用死循环while和if/else实现将用户输入的三个整数排序
这里为什么要用死循环while呢?是为了方便测试各种数据排序场景


package net.ittimeline.java.core.control.ifstatement;

import java.util.Scanner;

/**
 * 使用If/else给用户输入的整数排序 按照从大到小
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 13:11
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class IfElseSort {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        while (true) {

            System.out.println("请输入第一个整数");
            int first = input.nextInt();

            System.out.println("请输入第二个整数");
            int second = input.nextInt();

            System.out.println("请输入第三个整数");
            int third = input.nextInt();


            //第一个数最小
            if (first < second && first < third) {
                if (second < third) {
                    System.out.println(first + " < " + second + " < " + third);
                } else if (second > third) {
                    System.out.println(first + " < " + third + " < " + second);
                }
            }

            //第二数最小
            else if (second < first && second < third) {
                if (first > third) {
                    System.out.println(second + " < " + third + " < " + first);

                } else if (first < third) {
                    System.out.println(second + " < " + first + " < " + third);

                }
            }
            //第三个数最小
            else if (third < first && third < second) {
                if (first > second) {
                    System.out.println(third + " < " +second + " < " + first);

                } else if (first < second) {
                    System.out.println(third + " < " + first + " < " + second);

                }
            }
        }


    }

}



4.5 选择结构switch/case

switch语句由一个表达式和多个case语句以及default语句组成,switch语句中表达式的数据类型只能是byte,short,char和int以及枚举(enum)类型,不能是boolean类型,否则会编译出错,同时在JDK7以后switch语句支持String类型。case之后只能声明常量值,不能声明范围,break关键字表示跳出switch语句,根据实际业务场景是可选的。而default语句类似于if/else的else语句,也是可选的,位置也是灵活的,但是通常放到最后一个case语句下面。

switch语句的执行流程
首先计算switch表达式的值,然后拿switch表达式的值和case语句的常量值和进行相等性判断,如果相等则会执行对应的case语句中的代码块,直到执行case语句中的break后跳出switch语句。
如果每个case语句的值和switch语句表达式的值不相等,则会执行default语句的代码块,直到遇到break结束switch语句。


switch(expression){
    case constant value :
        //代码块
        break;
    
    case constant value :
        //代码块
        break;
    
    case constant value :
        //代码块
        break;
    
    default :
        //代码块
        break;
}


使用switch/case实现等值判断


package net.ittimeline.java.core.control.switchstatement;

/**
 * switch case使用
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-05 10:58
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class SwitchTest {


    public static void main(String[] args) {
        //变量或者表达式的值只能是byte,short,char,int,enum,String
        int number=0;
        switch (number){
            case 1:
                System.out.println("number =1");
                //每一个case都需要break,break表示跳出switch语句
                break;
            case 2:
                System.out.println("number =2");

                break;
            case 3:
                System.out.println("number =3");
                break;
            case 4:
                System.out.println("number =4");
                break;
                //如果所有的case都不匹配,则会进入default
            default:
                System.out.printf("number =%d",number);

        }
    }
}


虽然Java没有强制规定每个case语句必须加上break,而C#(微软推出的一门编程语言)是规定case语句必须加上break。程序在执行时可能会得到错误的结果。


package net.ittimeline.java.core.control.switchstatement;

/**
 * switch not with case
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-02 13:12
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class SwitchDemo2 {

    public static void main(String[] args) {

        for (int i = 0; i <7 ; i++) {
            switch (i){
                case 1:
                    System.out.println("case 1");
                case 2:
                    System.out.println("case 2");
                case 3:
                    System.out.println("case 3");
                case 4:
                    System.out.println("case 4");
                case 5:
                    System.out.println("case 5");
                default:
                    System.out.println("default");

            }
        }
    }
}


程序运行结果
default
case 1
case 2
case 3
case 4
case 5
default
case 2
case 3
case 4
case 5
default
case 3
case 4
case 5
default
case 4
case 5
default
case 5
default
default

如果想要获取正确的运行结果,需要在case语句加上break,当执行到break时表示退出switch语句


package net.ittimeline.java.core.control.switchstatement;

/**
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-02 13:10
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class SwitchDemo {

    public static void main(String[] args) {
        for (int i = 0; i < 7; i++) {
            switch (i) {
                case 1:
                    System.out.println("case 1");
                    break;
                case 2:
                    System.out.println("case 2");
                    break;
                case 3:
                    System.out.println("case 3");
                    break;
                case 4:
                    System.out.println("case 4");
                    break;
                case 5:
                    System.out.println("case 5");
                    break;
                default:
                    System.out.println("default");
                    break;


            }

        }
    }
}


为什么Java不强制开发人员在使用switch/case时不强制加上break呢,因为有些场景虽然是不同的case值,但是执行的业务逻辑是一样的。

根据月份判断季节


package net.ittimeline.java.core.control.switchstatement;

import java.util.Scanner;

/**
 * 根据用户输入的月份判断季节
 *
 * 1,2,12是冬季
 * 3,4,5是春季
 * 6,7,8是夏季
 * 9,10,11是秋季
 * 12,1,2是冬季
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-04 18:23
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class JudegMonth {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("请输入月份");
        int month = input.nextInt();

        switch (month) {
            case 1:
            case 2:
            case 12:
                System.out.printf("当前月份%d是冬季",month);
                break;
            case 3:
            case 4:
            case 5:
                System.out.printf("当前月份%d是春天",month);
                break;
            case 6:
            case 7:
            case 8:
                System.out.printf("当前月份%d是夏季",month);
                break;
            case 9:
            case 10:
            case 11:
                System.out.printf("当前月份%d是秋季",month);
                break;


        }
    }
}


根据用户输入的年月日判断是当年的第几天


package net.ittimeline.java.core.control.switchstatement;

import java.util.Scanner;

/**
 * 利用switch不带break的特性
 * 根据用户输入的年月日判断是当年的第几天
 * 如果switch case 不加break,程序会执行匹配到的case直到遇到break或者switch执行结束
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 09:41
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class GetDaysByMonthDay {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);


        System.out.println("请输入年份");
        int year = input.nextInt();


        //统计总天数
        int sumDays = 0;


        //判断用户输入的年份是否是闰年

        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
            //如果是闰年 一年有366天
            System.out.printf("%d年是闰年\n", year);
            sumDays += 1;
        }


        System.out.println("请输入月份");

        int month = input.nextInt();

        System.out.println("请输入日(几号)");

        int day = input.nextInt();


        switch (month) {

            case 12:
                sumDays += 31;
            case 11:
                sumDays += 30;
            case 10:
                sumDays += 31;
            case 9:
                sumDays += 30;
            case 8:
                sumDays += 31;
            case 7:
                sumDays += 31;
            case 6:
                sumDays += 30;
            case 5:
                sumDays += 31;
            case 4:
                sumDays += 30;
            case 3:
                sumDays += 31;
            case 2:
                sumDays += 28;
            case 1:
                sumDays += day;

        }


        System.out.println("2019年" + month + "月" + day + "日是当年的第" + sumDays + "天");
    }
}


判断字符是元音还是辅音


package net.ittimeline.java.core.control.switchstatement;

import java.util.Random;
import static net.ittimeline.java.core.util.lang.PrintUtils.*;

/**
 * 判断字符是元音还是辅音
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-02 12:42
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class VowelsAndConsonants {

    public static void main(String[] args) {
        Random random=new Random(88);
        for (int i=0;i<100;i++){
            //产生97-122之间的随机数
            int c=random.nextInt(26)+'a';
            //打印 字符对应的数字以及是元音还是辅音
            print((char)c+", "+c);

            switch (c){
                //元音
                case 'a':
                case 'e':
                case 'i':
                case 'o':
                case 'u':
                    print(",vowel");
                    break;
                case 'y':
                case 'w':
                    //有时候是元音
                    print(",Sometimes a vowel");
                    break;
                    //默认是辅音
                default:
                    print(",consonant");
            }
            println();
        }

    }
}


在JDK7以前,switch/case语句的条件表达式的类型只能支持byte,short,int,char和enum,而String是日常开发中最常用的数据类型,在JDK7后switch/case终于支持String。


package net.ittimeline.java.core.control.switchstatement;

import java.util.Scanner;

/**
 * JDK7新特性-switch支持String类型
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-04 18:32
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class SwitchString {


    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        String description;
        System.out.println("请输入你的性别");
        String gender = input.next();

        /**
         * 根据输入的性别生成招呼用语
         */
        switch (gender) {
            case "男":
                description = "你好,先生";
                break;
            case "女":
                description = "你好,女士";
                break;
            default:
                description="你好";
                break;
        }

        System.out.println(description);
    }
}


但是由于switch/case语句的case 值是不能重复的,在使用String时尤其要注意。因为在Java中字符串可以使用Unicode字符来替换,也可能造成case值重复。


package net.ittimeline.java.core.control.switchstatement;

import java.util.Scanner;

/**
 * JDK7新特性-switch支持String类型
 * case 值 重复
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-04 18:32
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class SwitchString2 {


    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        String description;
        System.out.println("请输入你的性别");
        String gender = input.next();

        /**
         * 根据输入的性别生成招呼用语
         */
        switch (gender) {
            case "男":
                //字符串男对应的unicode编码就是\u7537
           // case "\u7537":
                description = "你好,先生";
                break;

            case "女":
                description = "你好,女士";
                break;
            default:
                description="你好";
                break;
        }

        System.out.println(description);
    }
}


使用switch/case实现基于字符和字符串的小写字母转大写字母


package net.ittimeline.java.core.control.switchstatement;

import java.util.Scanner;

/**
 * 使用switch/case分别基于字符串和字符实现将小写字母转换为大写字母
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-05 15:34
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class SwitchLowerCaseUpperCase {

    public static void main(String[] args) {


        Scanner input = new Scanner(System.in);
        System.out.println("请输入需要转换的小写字母:");
        String lowercase = input.next();
        String uppercase = "";
        switch (lowercase) {
            case "a":
            case "b":
            case "c":
            case "d":
            case "e":
            case "f":
            case "g":
            case "h":
            case "i":
            case "j":
            case "k":
            case "l":
            case "m":
            case "n":
            case "o":
            case "p":
            case "q":
            case "r":
            case "s":
            case "t":
            case "u":
            case "v":
            case "w":
            case "x":
            case "y":
            case "z":
                //直接使用String类封装的toUpperCase方法实现小写字母转大写字母
                uppercase = lowercase.toUpperCase();
                break;
        }

        //输出转换结果 这里的%s表示字符串
        System.out.printf("基于字符串小写字母%s转换为大写字母的结果是%s\n", lowercase, uppercase);

        //获取输入字符串中的第一个字符
        Character ch = lowercase.charAt(0);
        switch (ch) {
            case 'a':
            case 'b':
            case 'c':
            case 'd':
            case 'e':
            case 'f':
            case 'g':
            case 'h':
            case 'i':
            case 'j':
            case 'k':
            case 'l':
            case 'm':
            case 'n':
            case 'o':
            case 'p':
            case 'q':
            case 'r':
            case 's':
            case 't':
            case 'u':
            case 'v':
            case 'w':
            case 'x':
            case 'y':
            case 'z':
                //小写字母的编码减去32就是大写字母的编码
                int upperCaseNumber = (int) ch - 0x20;
                //将数字转换为对应的字符
                Character uppperCase = Character.valueOf((char) upperCaseNumber);
                //输出转换结果,这里的%c表示字符
                System.out.printf("基于字符 小写字母%c转换为大写字母的结果是%c\n", ch, uppperCase);
                break;

        }


    }
}


switch/case和if/else语句的比较

  • 凡是可以使用switch/case的结构,都可以使用if/else转换。反之不成立
  • 选择结构中,即可以使用switch/case,又可以使用if/else时,优先使用switch case,因为switch/case执行效率稍高
  • switch case适合做等值判断,if/else适合做区间判断。
package net.ittimeline.java.core.control.switchstatement;

import java.util.Scanner;

/**
 * 根据用户输入的分数判断等级
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 10:46
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class GetGradeByScore {

    public static void main(String[] args) {

        Scanner input= new Scanner(System.in);
        System.out.println("请输入你的分数");
        int score=input.nextInt();
        String ifElseGrade=getGradeByScoreIfElse(score);
        System.out.printf("if else结构实现  分数%d对应的等级是%s\n",score,ifElseGrade);
        String switchCaseGrade=getGradeByScoreSwitchCase(score);
        System.out.printf("switch case结构实现  分数%d对应的等级是%s\n",score,switchCaseGrade);


    }


    /**
     * 使用if/else实现根据用户输入的分数获取等级
     * @param score
     * @return
     */
    public static String getGradeByScoreIfElse(int score){
        String grade="";
        if(score>90){
            grade="A";
        }
        else if(score>=70&&score<80){
            grade="B";
        }
        else if(score>=60&&score<70){
            grade="C";
        }
        else if((score<60)){
            grade="D";
        }
        return grade;
    }


    /**
     * 使用if/else实现根据用户输入的分数获取等级
     * @param score
     * @return
     */
    public static String getGradeByScoreSwitchCase(int score){
        String grade="";
        int value=score/10;
        switch (value){

            case 9:
                grade="A";
                break;
            case 8:
            case 7:
                grade="B";
                break;
            case 6:

                grade="C";
                break;
            case 5:
            case 4:
            case 3:
            case 2:
            case 1:
                grade="D";
                break;
        }
        return grade;
    }
}



4.6 循环结构while和do/while

每个循环结构都有如下四个要素

1.初始化条件
2.循环条件 必须是boolean类型
3.循环体
4.迭代条件

而循环结构的执行流程是
循环的执行顺序
1.初始化条件
2.循环条件
3.循环体
4.迭代条件

2.循环条件
3.循环体
4.迭代条件

2.循环条件
3.循环体
4.迭代条件
...

while循环的结构是


while(boolean_expression){
    statement;
    [iterator_statement]
}

while循环的流程图

java 可以控制系统音量 java程序控制_java 可以控制系统音量_11


当boolean_expression为true时,就会循环执行代码块中的内容,直到遇到boolean_expression为false则会退出while循环。

package net.ittimeline.java.core.control.whilestatement;
import static net.ittimeline.java.core.util.lang.PrintUtils.*;

/**
 * 使用while循环判断随机数是否小于0.99
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-02 12:46
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class WhileTest {


    /**
     * 定义condition方法作为while循环的条件
     * @return Math.random()是否小于0.99
     */
    static boolean condition(){
        boolean result=Math.random()<0.99;
        println("result = "+result);
        return result;
    }

    public static void main(String[] args) {

        while (condition()){
            println("Inside  'while'");
        }
       println("Exited 'while'");
    }
}


使用while循环计算1-100以内的偶数和,借助该程序理解循环的四要素
在写while循环时特别容易忘记写迭代条件,如果while循环没有迭代条件,则会变成死循环,
在程序开发中应该尽量避免出现死循环。


package net.ittimeline.java.core.control.whilestatement;

/**
 * 计算1-100以内的偶数
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 17:28
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class While100EvenNumber {




    public static void main(String[] args) {

        /**
         * 循环四要素
         *
         * 1.初始化条件
         * 2.循环条件 必须是boolean类型
         * 3.循环体
         * 4.迭代条件
         */


        //1.循环的初始条件
        int sum=0;
        int i=1;
        //2.循环条件
        while (i<=100){
            //3.循环体
            if(i%2==0){
                sum+=i;
            }
            //4.循环的迭代条件
            i++;
        }

        System.out.println("1-100以内的偶数和是"+sum);
    }
}


while循环和for循环可以相互替换,使用for循环实现1-100以内的偶数和


package net.ittimeline.java.core.control.forstatement;

/**
 * 求100以内的偶数
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 11:22
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class For100EvenNumber {

    public static void main(String[] args) {
        int sum=0;
        for (int i = 1; i <=100 ; i++) {

            if(i%2==0){
                sum+=i;
            }
        }

        System.out.println("1-100以内的偶数和是"+sum);
    }
}


do/while循环在日常开发中几乎不怎么用,它和while循环的区别就是至少执行一次循环体的内容

do/while循环和while循环的对比


package net.ittimeline.java.core.control.whilestatement;
import  static net.ittimeline.java.core.util.lang.PrintUtils.*;
/**
 * while循环和do/while循环的区别
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 18:52
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class DoWhileTest {



    /**
     * 测试while循环
     * @param number
     */
    public static void testWhile(int number){

        while (number<10){
            System.out.println(" while循环 number = "+number++);
        }
    }

    public static void testDoWhile(int number){
        do{
            System.out.println(" do while循环 number = "+number++);


        }while (number<10);
    }



    public static void main(String[] args) {

        /**
         * 当while循环和do/while循环都满足循环条件时,while循环和do/while循环是等价的
         */
        int number=1;
        testWhile(number);
        testDoWhile(number);
        /**
         * 当while循环的循环条件不满足时,do...while循环会比while循环多执行一次
         */
        number=10;
        testWhile(number);
        println();
        testDoWhile(number);

    }
}



4.7 循环结构for

for循环是日常开发程序中使用最多的循环结构,与while循环的不同之处在于for循环的循环初始条件(变量)只能在for循环内使用,而while循环的循环初始条件(变量)可以在whiel循环外部使用。

for循环的循环结构也是由之前提到的循环结构四要素组成,执行顺序也和while一样


for(循环的初始条件;循环条件;迭代条件){
    循环体
}

for循环执行流程图

java 可以控制系统音量 java程序控制_选择结构_12

使用for循环输出1-100


package net.ittimeline.java.core.control.forstatement;

/**
 * for循环打印输出1-100
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-07-30 16:47
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class ForTo100 {

    public static void main(String[] args) {
        for (int i =1;i<=100;i++){
            System.out.print(i+" ");
        }
    }
}


使用for循环求1-100以内的和


package net.ittimeline.java.core.control.forstatement;

/**
 * 求1-100以内的和
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 11:24
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class For100Sum {

    public static void main(String[] args) {
        //定义变量保存相加的和
        int sum=0;
        for (int i = 1; i <=100 ; i++) {
            //循环累加
            sum+=i;
        }
        System.out.println("1到100以内的和是"+sum);
    }
}


编写程序从1循环到150,并且每行打印一个值,另外在每个3的倍数行上打印foo, 在每个5的倍数行上打印biz, 在每个7的倍数行上打印baz


package net.ittimeline.java.core.control.forstatement;

/**
 * 编写程序从1循环到150,并且每行打印一个值
 * 另外在每个3的倍数行上打印foo
 * 在每个5的倍数行上打印biz
 * 在每个7的倍数行上打印baz
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 11:28
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class ForTo150 {

    public static void main(String[] args) {

        for (int i = 1; i < 150; i++) {

            if (i % 3 == 0) {
                System.out.println(i + " foo ");

            }
            if (i % 5 == 0) {
                System.out.println(i + " biz ");

            }
            if (i % 7 == 0) {
                System.out.println(i + " baz ");

            } else {
                System.out.println(i);

            }

        }
    }
}


输入两个正整数m和n,求其最大公约数和最小公倍数

  • 最大公约数:两个数同时能被除尽的最大值
  • 最小公倍数:同时是两个数的倍数的最小值
  • 比如12和20的最大公约数是4,最小公倍数是60
package net.ittimeline.java.core.control.forstatement;

import java.util.Scanner;

/**
 * 输入两个正整数m和n,求其最大公约数和最小公倍数
 * 最大公约数:两个数同时能被除尽的最大值
 * 最小公倍数:同时是两个数的倍数的最小值
 * 比如12和20的最大公约数是4,最小公倍数是60
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 15:53
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class ForGreatestCommonDivisorLeastCommonMultiple {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("请输入第一个数");
        int m = input.nextInt();

        System.out.println("请输入第二个数");
        int n = input.nextInt();


        //定义变量保存最大公约数
        int greatestCommonDivisor = 0;

        //定义变量保存最小公倍数
        int leastCommonMultiple = 0;


        int min = m > n ? n : m;
        //求最大公约数

        /**
         * 查找最大公约数 循环的次数 可以在用户输入的两个整数中最小的那个值的次数之内
         * 如果找到了就中断循环
         */
        for (int i = min; i >= 1; i--) {
            if ((n % i) == 0 && (m % i) == 0) {
                System.out.println(" i =" + i);
                greatestCommonDivisor = i;
                break; //跳出for循环
            }
        }
        System.out.printf("%d和%d的最大公约数是%d \n", m, n, greatestCommonDivisor);

        //求最小公倍数
        int num = m * n;
        for (int i = 0; i < num; i++) {

            if (num % m == 0 && num % n == 0) {
                leastCommonMultiple = num / m;
                break; //跳出for循环
            }

        }
        System.out.printf("%d和%d的最小公倍数是%d \n", m, n, leastCommonMultiple);

    }

}


使用for循环输出指定范围内的所有水仙花数字


package net.ittimeline.java.core.control.forstatement;

import java.util.Scanner;

/**
 * 使用for循环输出指定范围内的所有水仙花数字
 *
 *
 * 水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),
 * 水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。
 *
 *
 * 实现思路
 * 首先通过取模运算获取三位数的各个数字
 * 然后使用Math.pow函数实现求各个数字的三次幂运算
 * 再把三个整数的幂运算求和,和用户输入的数字进行比较
 * 如果相等,那就是水仙花数
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 16:46
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class ForNarcissisticNumber {

    public static void main(String[] args) {

        Scanner input=new Scanner(System.in);
        System.out.println("请输入你要在指定范围内查找的水仙花数【100-999】");



        int number=input.nextInt();
        for (int i=100;i<number;i++){

            int hundereds=i/100;
            int decade=i/10%10;
            int theUnit=i%10;

            int narcissisticNumber=(hundereds*hundereds*hundereds)+(decade*decade*decade)+(theUnit*theUnit*theUnit);


            if(i==narcissisticNumber){
                System.out.printf("你输入的数字%d是水仙花数\n",i);
            }else{
                System.out.printf("你输入的数字%d不是水仙花数\n",i);

            }

        }
    }
}



4.8 死循环

当某些业务场景不知道循环的次数时,可以使用死循环实现.
while循环的死循环结构为


while(true){
    //循环体
}


for循环的死循环结构为


for(;;){
    //循环体
}


从键盘读取个数不确定的数,并判断读入的正数和负数的个数,输入0时结束程序


package net.ittimeline.java.core.control.forstatement;

import java.util.Scanner;

/**
 * for和while死循环应用场景
 * 从键盘读取个数不确定的数,并判断读入的正数和负数的个数,输入0时结束程序
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 19:34
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class ForWhileDeadLoop {


    public static void main(String[] args) {

        //正数个数的数量
        int  positiveNumberCount=0;
        //负数个数的数量
        int negativeNumberCount=0;

        Scanner input =new Scanner(System.in);


        //使用while循环实现
        while (true){
            System.out.println("while循环 请输入数字");
            int number=input.nextInt();
            if(number>0){
                positiveNumberCount++;

            }
            else if(number<0){
                negativeNumberCount++;
            }

            if (number==0){
                break;//中断并跳出循环
            }

        }

        System.out.printf("while循环输入的正数数量是%d,输入的负数数量是%d\n",positiveNumberCount,negativeNumberCount);

        //使用for循环实现
        for (;;){
            System.out.println("for循环 请输入数字");
            int number=input.nextInt();
            if(number>0){
                positiveNumberCount++;

            }
            else if(number<0){
                negativeNumberCount++;
            }

            if (number==0){
                break;//中断并跳出循环
            }
        }



        System.out.printf("for循环输入的正数数量是%d,输入的负数数量是%d\n",positiveNumberCount,negativeNumberCount);

    }
}



4.9 循环中断-break和continue

break在循环中表示结束循环,如果是嵌套循环,
continue表示结束本次循环,直接进入下一次循环。

break和continue关键字之后的语句都不会再被执行。

break和continue默认结束包含此关键字最近的循环,如果想要break和continue结束外层循环,可以使用带标签的循环实现。


package net.ittimeline.java.core.control.breakcontinue;

import static net.ittimeline.java.core.util.lang.PrintUtils.*;

/**
 * 理解break和continue关键字的作用
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 22:29
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class BreakAndContinueSimple {

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            if (i == 9) {
                break; //跳出当前循环
                // print(" i = "+i); //不可达代码

            }
            if (i % 3 == 0) {
                continue; //结束本次循环,调到下次循环
                // print(" i = "+i); //不可达代码
            }
            println(" i = " + i);
        }
    }
}


理解break和continue关键字在循环中的作用


package net.ittimeline.java.core.control.breakcontinue;

import static net.ittimeline.java.core.util.lang.IntArrayGeneratorUtils.*;
import static net.ittimeline.java.core.util.lang.PrintUtils.*;

/**
 * 循环中断
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-02 10:45
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class BreakAndContinue {

    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {
            if (i == 76) {
                break;
            }
            if (i % 9 != 0) {
                continue;
            }
            //输出0-75之间能被9整除的数字
            System.out.print(i + " ");
        }
        println();

        //foreach循环
        for (int i : range(100)) {
            if (i == 76) {
                break;
            }
            if (i % 9 != 0) {
                continue;
            }
            //输出0-75之间能被9整除的数字
            System.out.print(i + " ");
        }
        println();

        int i = 0;
        while (true) {
            i++;
            int j = i * 27;
            if (j == 1269) {
                break;
            }

            if (i % 10 != 0) {
                continue;
            }
            System.out.print(i + " ");
        }


    }
}



4.10 JDK1.5新特性-foreach循环

foreach在C#语言中是一个关键字,而Java中的foreach循环是for循环实现的,它通常用于遍历Java中常用的数据结构,例如数组、链表等等。

其循环结构为


for(数据类型 变量名:数据结构){
    循环体
}


这里主要先演示使用foreach遍历数组,关于数组的详细介绍,会在下一章给出。

首先在java-core-util模块中实现一个整型数组生成器


package net.ittimeline.java.core.util.lang;

/**
 * 数组生成器
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-02 10:47
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class IntArrayGeneratorUtils {

    /**
     * 创建一个指定大小的整数数组
     * @param size
     * @return
     */
    public static int[] range(int size){
        int[] result=new int[size];
        for (int i=0;i<size;i++){
            result[i]=i;
        }
        return result;
    }


    /**
     * 生成一个指定区间的整数数组
     * @param start
     * @param end
     * @return
     */
    public static int[] range(int start,int end){
        int size=end-start;
        int[]result=new int[size];
        for (int i=start;i<size;i++){
            result[i]=start+i;
        }
        return result;
    }


    /**
     * 生成一个指定区间的整数数组
     * @param start 循环的开始条件
     * @param end
     * @param step
     * @return
     */
    public static int[] range(int start,int end,int step){
        int size=(end-start)/step;
        int[] result=new int[size];
        for (int i=0;i<size;i++){
            result[i]=start+(i*step);
        }
        return result;
    }
}


使用foreach遍历整型数组


package net.ittimeline.java.core.control.foreach;
import static net.ittimeline.java.core.util.lang.IntArrayGeneratorUtils.*;
import static net.ittimeline.java.core.util.lang.PrintUtils.*;
/**
 * foreach遍历整型数组
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-02 11:19
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class ForeachInt {

    public static void main(String[] args) {

        for (int i:range(10)){
            print(i+" ");
        }
            println();

        for (int i:range(1,15)){
            System.out.print(i+" ");
        }

        println();

        for (int i:range(1,15,2)){
            System.out.print(i+" ");
        }
    }
}


使用foreach遍历字符串


package net.ittimeline.java.core.control.foreach;

/**
 * 遍历字符串
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-02 11:24
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class ForeachString {
    public static void main(String[] args) {

        String bookName="Java编程思想第四版";
        //字符串的本质是字符数组
        for (char ch:bookName.toCharArray()){
            System.out.print(ch+" ");
        }

    }
}


使用foreach遍历浮点类型数组


package net.ittimeline.java.core.control.foreach;

import java.util.Random;

/**
 * foreach遍历浮点类型数组
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-02 11:16
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class ForeachFloat {

    public static void main(String[] args) {
        Random random=new Random(88);
        float[]floats=new float[10];
        for (int i=0;i<floats.length;i++){
            floats[i]=random.nextFloat();
        }

        for (float f:floats){
            System.out.println("f = "+f);
        }

    }
}



4.11 循环嵌套

当把一个循环结构(循环B)声明在另外一个循环结构(循环A)的循环体中,此时就构成了循环的嵌套,此时循环A被称作为外层循环,循环B被称为内层循环。

嵌套循环的执行流程是外层循环执行一次,内层循环执行一遍。

假设外层循环循环m次,内层循环循环n次,那么内层循环的总次数是m*n次。

package net.ittimeline.java.core.control.forstatement;

/**
 * 理解嵌套循环结构
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 20:02
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class ForForStructureTest {

    public static void main(String[] args) {
        //外层循环执行一次
        for (int i=1;i<=3;i++){
            //内层循环执行五次
            for (int j=1;j<=5;j++){
                System.out.println("i = "+i +" j = "+j);
            }
        }
    }
}


使用嵌套for循环实现打印九九乘法表


package net.ittimeline.java.core.control.forstatement;
import static net.ittimeline.java.core.util.lang.PrintUtils.*;

/**
 * 循环嵌套
 * 实现九九乘法口诀表
 * 1 * 1 = 1	
 * 1 * 2 = 2	2 * 2 = 4	
 * 1 * 3 = 3	2 * 3 = 6	3 * 3 = 9	
 * 1 * 4 = 4	2 * 4 = 8	3 * 4 = 12	4 * 4 = 16	
 * 1 * 5 = 5	2 * 5 = 10	3 * 5 = 15	4 * 5 = 20	5 * 5 = 25	
 * 1 * 6 = 6	2 * 6 = 12	3 * 6 = 18	4 * 6 = 24	5 * 6 = 30	6 * 6 = 36	
 * 1 * 7 = 7	2 * 7 = 14	3 * 7 = 21	4 * 7 = 28	5 * 7 = 35	6 * 7 = 42	7 * 7 = 49	
 * 1 * 8 = 8	2 * 8 = 16	3 * 8 = 24	4 * 8 = 32	5 * 8 = 40	6 * 8 = 48	7 * 8 = 56	8 * 8 = 64	
 * 1 * 9 = 9	2 * 9 = 18	3 * 9 = 27	4 * 9 = 36	5 * 9 = 45	6 * 9 = 54	7 * 9 = 63	8 * 9 = 72	9 * 9 = 81	
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 19:53
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class ForForMultiplicationTableTest {

    public static void main(String[] args) {

        int number=9;
        //外层循环控制行
        for (int i=1;i<=number;i++){
            //内层循环控制每行的列
            for (int j=1;j<=i;j++){
                print(j+ " * "+i+" = "+(i*j)+"\t");
            }
            //如果一行执行完则换行
            println("");
        }
    }
}


使用for循环打印菱形


package net.ittimeline.java.core.control.forstatement;
import static net.ittimeline.java.core.util.lang.PrintUtils.*;
/**
 * 使用嵌套for循环打印菱形
 *
 *     *
 *    * *
 *   * * *
 *  * * * *
 * * * * * *
 *  * * * *
 *   * * *
 *    * *
 *     *
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 20:18
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class ForForRhombus {

    public static void main(String[] args) {

        /**
         * 打印菱形实现步骤
         * 首先将菱形拆解为两个等腰三角形
         * 然后分别用两个嵌套循环打印
         * 每个嵌套循环中,外层循环控制行数,内层循环控制输出的内容:即空格和*
         *
         *
         *
         */



        String star="* ";

        /**
         *  第一个for循环
         * 外层控制循环次数 一共是五次,因为等边三角形占了5行
         * 内层循环控制内容 内层循环的第一个循环先打4-i个空格,内层循环的第二个循环打印i
         *
         *
         * * * *
         *    * *
         *   * * *
         *  * * * *
         * * * * * *
         *
         *
         *
         */

        //第一个嵌套for循环

        //外层循环控制行数
        for (int i=0;i<5;i++){

            //内层循环控制每行的内容

            for (int j=0;j<4-i;j++){
                print(" ");
            }
            for (int k=0;k<=i;k++){
                print(star);
            }

            println("");
        }

        /**
         * * * * *
         *  * * *
         *   * *
         *    *
         */

        //总共是9行,上一次循环是5行,这里外层循环就只需要四次

        for (int i=4;i>0;i--){
            //打印空格 空格的个数是4-i
            for (int j=0;j<=4-i;j++){
                print(" ");
            }
            //打印星星
           for (int k=0;k<i;k++){
               print("* ");
           }
        //换行
           println("");
        }



    }
}


使用嵌套for循环实现求1-100以内的质数


package net.ittimeline.java.core.control.forstatement;

/**
 * 查找1-100以内的质数
 * 质数:只能被1和自身整除的数->从2开始,到这个数减1结束为止,都不能被这个数本身整除
 * 最小的质数是2
 * 能被1和自身整除的数字
 * @author liuguanglei 18601767221@163.com
 * @create 2019-07-30 16:53
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class FindPrimesTo100 {
    public static void main(String[] args) {
        int max=100;
        for (int i=2;i<max;i++){
            boolean prime=true;

            for (int j=2;j<i;j++){
                if(i%j==0){
                    prime=false;
                }
            }
            if(prime){
                System.out.println(i+" ");
            }
        }
    }
}


使用嵌套for循环实现求1-100000以内的质数,并统计执行的时间(毫秒数)


package net.ittimeline.java.core.control.forstatement;
import static net.ittimeline.java.core.util.lang.PrintUtils.*;
/**
 * 查找1-100000以内的质数
 * 质数:只能被1和自身整除的数->从2开始,到这个数减1结束为止,都不能被这个数本身整除
   最小的质数是2
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 21:30
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class FindPrimersTo100000 {

    public static void main(String[] args) {

        /**
         * 从2开始,到这个数减1结束为止,都不能被这个数本身整除
         */

        int count=0;
        boolean isPrimer=true;
        //返回当前时间的毫秒数
        long startTime=System.currentTimeMillis();
        int number=10_0000;

        for (int i=2;i<=number;i++){
            for (int j=2;j<i;j++){
                if(i%j==0){
                    isPrimer=false;
                }
            }

            if(isPrimer){
               // System.out.println("i = "+i);
                count++;
            }

            isPrimer=Boolean.TRUE;
        }
        long endTime=System.currentTimeMillis();


        printf("计算%d以内所有的质数耗时毫秒数为%d,质数的数量为%d",number,(endTime-startTime),count);


      // 程序输出结果 计算1-1000000所有的质数耗时毫秒数为11603,质数的数量为9592
    }
}


程序优化之后,再次使用嵌套for循环实现求1-100000以内的质数,并统计执行的时间(毫秒数)


package net.ittimeline.java.core.control.forstatement;

import static net.ittimeline.java.core.util.lang.PrintUtils.printf;

/**
 * 查找1-100000以内的质数
 * 质数:只能被1和自身整除的数->从2开始,到这个数减1结束为止,都不能被这个数本身整除
   最小的质数是2
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-10 21:30
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class FindPrimersTo100000Optimize {

    public static void main(String[] args) {

        /**
         * 从2开始,到这个数减1结束为止,都不能被这个数本身整除
         */

        boolean isPrimer=true;
        int count =0;
        long startTime=System.currentTimeMillis();
        int number=10_0000;
        for (int i=2;i<=number;i++){
            for (int j=2;j<=Math.sqrt(i);j++){
                if(i%j==0){
                    isPrimer=false;
                    break; //优化 支队本身非质数的自然数有效的
                }
            }

            if(isPrimer){
                count++;
            }

            isPrimer=Boolean.TRUE;
        }
        long endTime=System.currentTimeMillis();

        printf("计算%d以内所有的质数耗时毫秒数为%d,质数的数量为%d",number,(endTime-startTime),count);

        //程序输出结果:计算100000以内所有的质数耗时毫秒数为11,质数的数量为9592

    }
}



4.12 循环结构-带标签的循环

在循环嵌套时,如果希望在内层循环中断到外层循环时,可以使用带标签的循环实现。
带标签的循环结构如下所示


outer: for(){

    inner:for(){
        
        break outer;
    }
    
}


带标签的for循环


package net.ittimeline.java.core.control.forlabel;

import static java.lang.System.out;

/**
 * 带标签的for循环
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-02 11:46
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class LabeledFor {
    public static void main(String[] args) {
        int i = 0;
        outer:
        for (; true; ) {
            inner:
            for (; i < 10; i++) {
                out.println(" i= " + i);
                if (i == 2) {
                    out.println("continue");
                    continue;
                }
                if (i == 3) {
                    out.println("break");
                    break;
                }
                if (i == 7) {
                    out.println("continue outer");
                    i++;
                    //结束本次循环,调到外层循环
                    continue outer;
                }

                if (i == 8) {
                    out.println("break outer");
                    break outer;
                }
                for (int k = 0; k < 5; k++) {
                    if (k == 3) {
                        out.println("continue inner");
                        continue inner;
                    }
                }

            }

        }
    }
}


带标签的while循环


package net.ittimeline.java.core.control.forlabel;
import static net.ittimeline.java.core.util.lang.PrintUtils.*;
/**
 * 带标签的while循环
 *
 * @author liuguanglei 18601767221@163.com
 * @create 2019-08-02 11:52
 * @website www.ittimeline.net
 * @since JDK11.03
 */
public class LabeledWhile {
    public static void main(String[] args) {
        int i=0;
        outer:
        while(i<9){
           int j=0;
          inner:while (j<9){
               if(j==6){
                   break outer;
               }
               println(" i = "+i+" j = "+j);
               j++;
           }
           i++;
        }
    }
}