> 文档中心 > JavaSE_02_程序逻辑控制与方法的使用

JavaSE_02_程序逻辑控制与方法的使用

目录

          • 顺序结构
          • 分支结构
            • 规范写法
            • 细节
            • switch(基于JDK8)
          • 循环结构
            • while()
            • break
            • continue
            • for()
            • 输入输出
          • 补充
            • 生成随机数
            • 引用数据类型判断是否相等
            • 用辗转相除法求两数最大公约数
        • 方法的定义与使用
            • 实参和形参的关系
            • overload(重载)
          • 方法递归
            • 什么场景下能用方法递归
            • 怎么样写出递归代码
            • 递归的优化
          • IDEA的调试
        • 杂项
顺序结构

多线程就不一定按书写顺序进行了

分支结构

条件表达式不宜过多,最多写俩

不加{}时,else根据就近原则匹配与他最近的if分支

规范写法
if(a>0){    //代码块}else if(a<0){    //代码块}else{    //代码块}
细节
int x= 10;if(x == 20);{    //高级语言后面加上; 代表着这一行语句的结束  此处来看,后面的代码块与前面的条件判别式无关sout("aaa");}    //执行结果,输出aaa
switch(基于JDK8)

switch(),括号里面的数据类型也可以是 byte或short类型的变量,因为对于数值型(byte、short)和字符型,如果是小于4字节的数据类型,在存储时会转为4字节,byte类型在保存时会转为int.

switch(int | char | String | enum){//其他所有类型都不能使用switch case 内容一 :     //执行内容     break; case 内容二 :     //     break; default :     //     break;}//若不加break,则执行所有满足条件的case,直到遇见breakbyte b = 45;short s = 456;switch(b) 或者 switch(s)是正确的
循环结构
while()
int i=1,sum=1,ret=0;while(i<=10){sum*=i;ret+=sum;i++;}
break

break默认只能终止当前循环。若想在跳出本轮循环的同时跳出外层循环:1. break label 2. return

int num= 100;test : while(num <= 200){    int a =1;    while(a <= 10){ if((a %3)==0){     sout(a);     break test; } a++;    }}//输出结果为3
continue

结束本轮循环,进行下一轮的循环

for()
for(1;2;3){//4}//执行顺序:1 2 4 3 2 4 3 2 4 3……//1 2 3都是可选的for(;;)

*快捷键 fori(IDEA),任何循环变量都用fori *

输入输出

输出

System.out.println();    //自带换行的输出System.out.print();    //不带换行的输出System.out.printf(format,msg);    //一般不用

占位符

在这里插入图片描述

系统输入:Scanner类

Scanner scanner = new Scanner(System.in);String name= scanner.nextLine();    //输入字符串int age= scanner.nextInt();double salary= scanner.nextDouble();
scanner.hasNextInt();    //返回boolean类型,判断是否输入了一个整型scanner.hasNextLine();    //字符串scanner.hasNextDouble();    //浮点型
补充
生成随机数
  • int maxValue = 1000;(int)(Math.random()*(maxValue+1))    //得到[0,1000]的任意一个整数//Math.random()等概率得到[0,1)的一个小数,因为这些数在存储时精度确定
  • Random random = new Random();int randomNum = random.nextInt(100)    //生成[0,100)的一个随机整数
引用数据类型判断是否相等

使用.equals()方法

String str1 = "abc";String str2 = "ac";if(str1.equals(str2)){}
用辗转相除法求两数最大公约数
private static int ouJiLiDe(int num1, int num2){    while(num1 > 0) { int temp = num1; num1 = num2 % num1; num2 = temp;    }    return num2;}

方法的定义与使用

方法的定义在调用前后均可

Java中没有函数声明这样的概念,一个方法只有函数名和形参而不予以实现是不行的,除非定义为抽象方法

没有返回值的方法仍然可以使用return;,表示终止方法的调用

实参和形参的关系

Java中,方法的参数传递只有值传递,形参的任何操作对实参没有任何影响

overload(重载)

在Java中,所有相同功能的方法,将其定义为相同的名字

方法重载发生在同一个类中,定义了若干个方法名称相同,参数列表不同(参数类型不同或参数个数不同)的一组方法,与返回值无关!

方法递归

在一个方法执行的内部,自己调自己

程序能实现方法递归的原因:当在程序中调用另一个方法时,当前程序会暂停,直到方法调用结束,当前程序才会继续执行

递归行为可以理解为多叉树的遍历,每一个节点要计算值,必须依赖当前节点的子节点。由于这种依赖关系,在没执行到叶子节点前,就相当于不断把节点压入栈中(这实际上是一个递推的过程);到了叶子节点,不再依赖其他节点就可以返回当前值了,于是相当于弹栈(相当于回溯过程)。

在这里插入图片描述

什么场景下能用方法递归
  1. 一个大问题可以拆分为若干个子问题的解
  2. 拆分后的子问题和原问题除了数据规模不同,解决思路完全相同
  3. 必须存在递归出口
怎么样写出递归代码
  1. 写递归函数时,不要纠结这个函数内部怎么实现,而要注意这个方法的语义(这个函数到底有什么功能)。一般在函数内部一开始判断当前情况是否为递归出口,若不是,则执行每个拆分的部分的实现逻辑。

能用递归写出来的逻辑,也一定可以用迭代写出来,反之则不一定。递归容易实现,但是存在大量重复计算。例如,计算斐波那契数列时,计算量随参数的增大呈指数增长。

递归的优化
  1. 思路一

    记忆化搜索(剪枝):已经被计算过的数字就不再重复计算,直接取值即可–利用Map集合

  2. 思路二

    DP(Dynamic Planning)

    自底向上的思路

IDEA的调试

设置断点,可以跳过当前行,也可以用逐行调试

杂项

类的命名采用“大驼峰命名法”

IDEA快捷键:鼠标放在代码画波浪线的地方,“Alter + Enter”按键组合可以快速修正错误