Java基础学习 2 (选择结构,循环结构)

本文详细介绍了Java中的程序执行流程,包括顺序、选择和循环结构,并深入解析了if语句的各种形式、switch-case语句以及三种循环(for、while、do-while)的使用方法和区别。

程序的执行流程

在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。
也就是说程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。
而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。
程序的执行流程分为三类:

  1. 顺序结构:代码从上往下一行一行去执行。
  2. 选择结构:也被称为分支结构。选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,所以产生选择,按照不同的选择执行不同的代码。
  3. 循环结构:循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。

Scanner

Java提供的类,可以同来获取从键盘中输入的数据。
使用步骤分为以下三步:

  1. 导入程序包:import java.util.Scanner;
  2. 创建键盘录入对象:Scanner a = new Scanner(System.in);
  3. 录入输入的数据:int b = a.nextInt();

if(选择结构)

if语句是条件选择语句,具有以下三种格式。

格式一:if

1     if(比较表达式或者是boolean类型的值) {
2         语句体;
3     }
4     /*执行流程
5     先计算比较表达式的值,看其返回值是true还是false。
6         如果是true,就执行语句体;
7         如果是false,就不执行语句体;*/

格式二:if-else

 1   if(比较表达式) {
 2             语句体1;
 3         }else {
 4             语句体2;
 5         }
 6 
 7     //注意事项:else后面是没有比较表达式的,只有if后面有。
 8     /*执行流程
 9     首先计算比较表达式的值,看其返回值是true还是false。
10     如果是true,就执行语句体1;
11     如果是false,就执行语句体2;*/

格式三:if-else if-else

 1  if(比较表达式1) {
 2             语句体1;
 3         }else if(比较表达式2) {
 4             语句体2;
 5         }else if(比较表达式3) {
 6             语句体3;
 7         }
 8         ...
 9         else {
10             语句体n+1;
11         }
12     //注意事项: 当只要有一个条件满足时,if语句结束。else是可以省略,但是不建议省略。
13     /*执行流程
14     首先计算比较表达式1看其返回值是true还是false,
15     如果是true,就执行语句体1,if语句结束。
16     如果是false,接着计算比较表达式2看其返回值是true还是false,
17     
18     如果是true,就执行语句体2,if语句结束。
19     如果是false,接着计算比较表达式3看其返回值是true还是false,
20     ...
21     
22     如果都是false,就执行语句体n+1。*/

if和三元表达式的区别:

  1. 三元表达式写出来的,if-else一定写的出来。
  2. if-else写出来的,三元表达式不一定写出来。

switch case(选择结构)

switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
格式如下:

 1    switch语句的格式
 2         switch(表达式){
 3             case 值1:
 4                 语句体1;
 5                 break;
 6             case 值2:
 7                 语句体2;
 8                 break;
 9             case 值3:
10                 语句体3;
11                 break;
12             ....
13             default14                 语句体n+1;
15                 break;
16         }
17     /*    switch语句的格式解释
18     (1):switch表示这是switch语句
19         表达式的取值:byte,short,int,char
20         JDK5以后可以是枚举(什么是枚举,以后再讲)
21         JDK7以后可以是String
22     (2):case后面跟的是要和表达式进行比较的值
23     (3):语句体部分可以是一条或多条语句
24     (4):break表示中断,结束的意思,可以结束switch语句
25     (5):default语句表示所有情况都不匹配的时候,就执行该处的内容,和if语句的else相似*/
26     /*执行流程
27     先计算表达式的值
28     然后和case后面的匹配,如果匹配成功就执行对应的语句,遇到break就会结束,否则执行default控制的语句*/

面试题:byte可以作为switch的表达式吗?
long可以作为switch的表达式吗?
String可以作为switch的表达式吗?

switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
所以,byte、String均可以作为switch的表达式,而long不可以作为switch的表达式。

for(循环结构)

for循环执行的次数是在执行前就确定的。
格式如下:

 1  for(初始化表达式语句;判断条件语句;控制条件语句) {
 2         循环体语句;
 3     }
 4     //注意事项:初始化表达式语句只执行一次
 5     /*执行流程:
 6     a:执行初始化表达式语句
 7     b:执行判断条件语句,看其返回值是true还是false
 8         如果是true,就继续执行
 9         如果是false,就结束循环
10     c:执行循环体语句;
11     d:执行控制条件语句
12     e:回到B继续。*/
13     //循环嵌套之后,外层循环控制行数,里层循环控制列数

for循环的经典算法(水仙花数,星星三角形,九九乘法表)

  • 水仙花数

所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
举例:153就是一个水仙花数。
153 = 111 + 555 + 333 = 1 + 125 + 27 = 153

 1    public class FlowerNumber {
 2                 public static void main(String args[]){
 3                     int a;
 4                     int b;
 5                     int c;
 6                     for (int i = 100 ; i <= 999 ; i++){
 7                        /*for (a = 1 ; a <= 9 ; a ++){
 8                             for (b = 0 ; b <= 9 ; b++){
 9                                 for (c = 0 ; c <= 9 ; c++){
10                                     if ((a * a * a) + (b * b * b) + (c * c * c) == a * 100 + b * 10 + c && i == a * 100 + b * 10 + c){
11                                         System.out.println(a * 100 + b * 10 + c);
12                                     }
13                                 }
14                             }
15                         }*//* 方法一  循环嵌套法*/
16                        /*a = (i / 100);
17                        b = (i % 100) / 10;
18                        c = (i % 10);
19                        if ((a * a * a) + (b * b * b) + (c * c * c) == a * 100 + b * 10 + c){
20                            System.out.println(i);
21                        }*//*方法二 取位数法*/
22                     }
23                 }
24             }
  • 星星三角形

用*绘制一个直角三角形(5x5)。
代码如下:

1          public class PaintStar {
2         public static void main(String args[]){
3             for (int i = 0 ; i < 5 ; i++){
4                 for (int j = 0 ; j <= i ; j++){
5                     System.out.print("*");
6                 }
7                 System.out.println();
8             }
9         } }
  • 九九乘法表

绘制一个九九乘法表。
代码如下:

 public class chengfabiao {
            public static void main(String args[]){
                for (int i = 1 ; i < 10 ; i++){
                    for (int j = 1 ; j <= i ; j++){
                        System.out.print(j + "*" + i + "=" + (j * i) + "\t");
                    }
                    System.out.println();
                }
            }
        }

while(循环结构)

while是最基本的循环。
格式为:

 1      初始化条件语句;
 2             while(判断条件语句) {
 3                  循环体语句;
 4                  控制条件语句;
 5            }
 6     /*执行流程:
 7     a:执行初始化条件语句;
 8     b:执行判断条件语句,看其返回值是true还是false
 9         如果是true,就继续执行
10         如果是false,就结束循环
11     c:执行循环体语句;
12     d:执行控制条件语句
13     e:回到b继续。*/

do while(循环结构)

对于 while 语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。
do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。

 1     初始化条件语句;
 2             do {
 3                 循环体语句;
 4                 控制条件语句;
 5             }while(判断条件语句);
 6     /*执行流程:
 7     a:执行初始化条件语句;
 8     b:执行循环体语句;
 9     c:执行控制条件语句;
10     d:执行判断条件语句,看其返回值是true还是false
11         如果是true,就继续执行
12         如果是false,就结束循环
13     e:回到b继续。*/

三种循环结构的区别

  1. do…while循环至少执行一次循环体。而for,while循环必须先判断条件是否成立,然后决定是否执行循环体语句。
  2. A: 如果你想在循环结束后,继续使用控制条件的那个变量,用while循环,否则用for循环。不知道用for循环。因为变量及早的从内存中消失,可以提高内存的使用效率。
  3. B:建议优先考虑for循环,然后是while循环 ,最后是do…while循环。

break

中断循环。可以用在Switch语句,也可以用在for,while循环中,用来结束循环。若离开了使用场景(switch,for,while)则没有意义。如果有循环嵌套,break影响的是最近的循环.

例题:试判断输出结果

1     for (int i=0; i<3; i++) {
2     for (int j=0; j<3; j++) {
3     if (i == j) {
4     break;
5     }
6     System.out.println("i=" + i + ", j=" + j);
7     }
8     }

解:①结果:i=1, j=0
i=2, j=0
i=2, j=1
②(1)第一次外层for循环:i=0,因为0<3,所以执行内层的for循环。
第一次内层for循环:i=0,j=0,因为0 == 0,所以结束循环。
(2)第二次外层for循环:i=1,因为1<3,所以执行内层的for循环。
第一次内层for循环:i=1,j=0,因为1!=0,所以输出i=1,j=0。
第二次内层for循环:i=1,j=1,因为1 == 0,所以结束循环。
(3)第三次外层for循环:i=2,因为2<3,所以执行内层的for循环。
第一次内层for循环:i=2,j=0,因为2!=0,所以输出i=2,j=0。
第二次内层for循环:i=2,j=1,因为2!=1,所以输出i=2,j=1。
第三次内层for循环:i=2,j=2,因为2==2,所以结束循环。
(4)第四次外层for循环:i=3,因为3=3,所以结束循环。

continue

用在循环场景当中,可以跳过部分循环而不终端,离开循环场景后无意义。

例题:试判断输出结果

1 for (int i=0; i<3; i++) {
2     for (int j=0; j<3; j++) {
3     if (i == j) {
4     continue;
5     }
6     System.out.println("i=" + i + ", j=" + j);
7     }
8     }

解:①结果:i=0, j=1
i=0, j=2
i=1, j=0
i=1, j=2
i=2, j=0
i=2, j=1
②(1)第一次外层for循环:i=0,因为0<3,所以执行内层的for循环。
第一次内层for循环:i=0,j=0,因为0 == 0,所以跳过此次循环。
第二次内层for循环:i=0,j=1,因为0!=1,所以输出i=0,j=1。
第三次内层for循环:i=0,j=2,因为0!=2,所以输出i=0,j=2。
(2)第二次外层for循环:i=1,因为1<3,所以执行内层的for循环。
第一次内层for循环:i=1,j=0,因为1!=0,所以输出i=1,j=0。
第二次内层for循环:i=1,j=1,因为1 == 1,所以跳过此次循环。
第三次内层for循环:i=1,j=2,因为1!=2,所以输出i=1,j=2。
(3)第三次外层for循环:i=2,因为2<3,所以执行内层的for循环。
第一次内层for循环:i=2,j=0,因为2!=0,所以输出i=2,j=0。
第二次内层for循环:i=2,j=1,因为2!=1,所以输出i=2,j=1。
第三次内层for循环:i=2,j=2,因为2==2,所以跳过此次循环。
(4)第四次外层for循环:i=3,因为3=3,所以结束循环。

转载于:https://www.cnblogs.com/like-lry/p/11208584.html

整理自尚硅谷视频教程springboot高级篇,并增加部分springboot2.x的内容 一、Spring Boot与缓存 一、JSR107 Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry。 • CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可 以在运行 期访问多个CachingProvider。 • CacheManager定义了创建、配置、获取、管理和控制多个唯一命名 的Cache,这些Cache 存在于CacheManager的上下文中。一个CacheManager仅被一个 CachingProvider所拥有。 • Cache是一个类似Map的结构并临时存储以Key为索引的值。一个 Cache仅被一个 CacheManager所拥有。 • Entry是一个存储在Cache中的key-value对。 • Expiry 每一 个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期 的状态。一旦过期,条 目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。 二、Spring缓存抽象 Spring从3.1开始定义了org.springframework.cache.Cache 和 org.springframework.cache.CacheManager接口来统一不同的缓存技术; 并支持使用JCache(JSR- 107)注解简化我们开发; • Cache接口为缓存的组件规范定义,包含缓存的各种操作集合; • Cache接 口下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheCache , ConcurrentMapCache 等; • 每次调用需要缓存功能的方法时,Spring会检查检查指定参的指定的目标方法是否 已经被调用 过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法 并缓存结果后返回给用户。下 次调用直接从缓存中获取。 • 使用Spring缓存抽象时我们需要关注以下两点; 1、确定方法需要被缓存 以及他们的缓存策略 2、从缓存中读取之前缓存存储的据 Cache 缓存接口,定义缓存操作。实现有:RedisCache、EhCacheCache、 ConcurrentMapCache等 CacheManager 缓存管理器,管理各种缓存(Cache)组件 @Cacheable 主要针对方法配置,能够根据方法的请对其结果进行缓存 @CacheEvict 清空缓存 @CachePut 保证方法被调用,又希望结果被缓存。 @EnableCaching 开启基于注解的缓存 keyGenerator 缓存据时key生成策略 serialize 缓存据时value序列化策略 @CacheConfig 抽取缓存的公共配置 三、几个重要概念&缓存注解 1、常用注解 2、常用参 名字 位置 描述 示例 methodName root object 当前被调用的方法名 #root.methodName method root object 当前被调用的方法 #root.method.name target root object 当前被调用的目标对象 #root.target targetClass root object 当前被调用的目标对象类 #root.targetClass args root object 当前被调用的方法的参列表 #root.args[0] 3、常用参SPEL说明 名字 位置 描述 示例 caches root object 当前方法调用使用的缓存列表(如 @Cacheable(value= {"cache1","cache2"}) ), 则有两 个cache #root.caches[0].name argument name evaluation context 方法参的名字. 可以直接 #参 名 ,也可以使用 #p0或#a0 的形 式,0代表参的索引; #iban 、 #a0 、 #p0 result evaluation context 方法执行后的返回值(仅当方法执 行之后的判断有效,如‘unless’ , ’cache put’的表达式 ’cache evict’的表达式 beforeInvocation=false ) #result 四、代码中使用缓存 1、搭建基本环境 1、导入据库文件 创建出department和employee表 2、创建javaBean封装据 3、整合MyBatis操作据库 1.配置据源信息 2.使用注解版的MyBatis; 1)、@MapperScan指定需要扫描的mapper接口所在的包
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值