Day_1
一 . java程序-流程控制语句
1. 顺序结构语句
进入到主程序之后的main方法被jvm调用之后
代码依次从上而下进行执行System类:后期学习
功能:System.exit(0);//0这个参数正常终止jvm
2.选择结构语句
2.1 if结构语句
格式1:if(表达式){
语句;
}
执行流程:1)先判断表达式是否成立
2)如果成立,执行语句内容
3)不成立,不执行
注意事项:1):if后面的表达式{} :由左大括号{的地方不能有分号,有分号的地方不能有大括号
局部代码块{} :限定一个变量的生命周期
格式2: if(表达式){
语句;
}else{
语句2
}
需求:模拟用户登录的执行流程
1)假设已经存在用户名和密码(模拟数据库)
String username = "admin";
String password = "admin";
2)用键盘录入用户名和密码
uname
psw
3)判断
如果输入的name和pwd与数据库中的一致,则提示"恭喜您,登录成功"
不一致,则提示"登陆失败"
Scanner类提供的一个方法
public String nextline():录入String 类型数据
1)已知存在用户名和密码-------String类型(字符串类型)
String Username = "admin";
String Password = "admin"; 也就是创建并提示录入字符串
Scanner 变量名 = String nextLine();
2)创建键盘录入对象
System.out.println("请您输入用户名");
System name = sc.nextline();
System.out.println("请您输入密码");
System password = sc.nextline();
3)判断
如果一致,输入的Username , name 和 Password,提示登陆成功
否则,提示"用户名或者密码错误"
if(name.equals(name)&&)(password.eqaals(psw)){
System.out.println("恭喜您,登陆成功");
}else{
System.out.println("用户名或者密码错误");
}
4)输出
System.out.println("over");
分析:
1)没有学习数据库,智能模拟;提供好一个用户名和密码username,password;
2)键盘录入数据: String 字符串数据(字符串比较是引用数据类型,不能用==)
用户名
密码
3)进行if判断
if(输入的用户名和密码如果和已知的用户名和密码匹配) 则登录成功,否则提示错误信息
if格式2的嵌套使用----------->if格式的多次使用
格式3: if(判断语句){
System.out.println("输出语句");
}else if(判断关系式二){
语句二
}else if{
语句三
} ........
对其判断时一定注意:数据的规范性
1)检测范围内的数据
2)检测范围外的数据
3)检测临界数据
格式2的模拟用户登录
import java.util.Scanner;//导包
class DengLu{
public static void main(String[] args){
String name = "admin";
String pwd = "admin"; //假设已经存在的name和password
Scanner sc = new Scanner(System.in);//创建键盘扫描器录入对象
System.out.println("请您输入用户名");
String username = sc.nextLine(); //使用String类型和nextLine()接受变量名
System.out.println("请您输入密码");
String password = sc.nextLine();//使用String类型和nextLine()接受变量名
if(username.equals(name)&&passawrod.equals(psw)){ //固定格式: 输入的变量名.equals(String(已有数据库内容))
//判断输入用户名和已有数据库中的用户名是否一致,不能使用==,==是引用数据类型,输出结果为ture/false,不是字符串内容
System.out.println("恭喜您,登陆成功");
}else{
System.out.println("用户名或者密码错误");
}
System.out.println("over");
}
}
2.1.1 if格式2和三元格式的区别
if语句格式2:相对于三元运算符的范围更大;
流程控制语句既可以操作输出语句也可以操作具体的数据值
三元运算符只能操作具体的数据
总结:能使用三元运算符实现的,一定能使用If格式2o实现
反之if格式2能实现的,三元不一定能实现
2.1.2 if结构格式2的嵌套使用
if(表达式){
if(表达式1){
语句一
}else{
语句二
}
}else{
if(表达式3){
语句三
}else{
语句四
}
}
执行流程:1)先判断表达式是否成立,成立再次判断表达式1.表达式1成立执行语句一,表达式1不成立执行语句二
2)表达式不成立则执行else,再次判断表达式3,若成立则执行语句三;不成立执行语句四
2.2switch结构语句—匹配语句
格式: switch(开关)(表达式){
case 值1: //case的值一定是个常量
语句1; //System.out.println("星期一");
break(打破);
......
......
......
default:(中文:默认)
语句3
break;
}
执行流程:
1)判断表达式的值和case值1进行匹配,如果匹配成功,执行语句一,break结束
2)如果case值1不匹配,继续和case的值2进行比较,如果匹配,执行语句2;
..........
3)如果上面的case值都和是switch中表达式的结果不匹配的,那么最终就执行default中的语句,然后程序默认执行到末尾结束了,break结束;
面试题:switch中表达式,可以是什么样的数据类型呢?
基本的能够使用的数据类型:
byte,short,char,int
jdk5以后,可以跟枚举(enum);
jdk7以后,可以是String类型;
case的穿透:利用case穿透实现代码的优化
2.2.1 switch语句中的注意事项
1)case语句后面跟的值只能是常量;
2)case语句中的break必须带上,否则会造成一个现象:case穿透
由于某个case已经匹配了,如果此时没有break,那么继续往下面case语句中穿透,知道遇到case中有break,则停止穿透;
3)switch语句的结束条件是什么?
a)语句break结束
b)程序默认执行到末尾
4)default可以在程序中的任何一个位置,在程序最后的时候可以省略break,在其 他位置必须带上break,否则将造成case穿透;
5)default的使用条件:输入的数值和case都不匹配的时候,执行default
3.循环结构语句
3.1 for循环结构语句
格式: for(初始化语句;条件表达式;控制体语句(步长语句)){
循环体语句;
输出
}
执行流程: 1)初始化语句进行赋值,只执行一次
2)然后判断条件表达式是否成立
如果成立,执行循环体语句-----然后执行控制体语句
3)继续判断条件表达式是否成立
如果成立,继续执行循环体语句
........
4)执行到条件表达式不成立,循环体语句结束
//求1-10的和
int sum = 0;
for(int x = 0;x<=10;x++){
sum += x ;
}
System.out.println(“总和的值是:”+sum);
3.1.1 for循环的求和思想
两个变量
1)最终结果变量 int sum = 0;
2)循环变量的x在不断的变化
3)循环获取一直变化的数据x
4)输出最终结果变量X即可
需求:1-100求和
class Qiuhe{
public static void main(String[] args){
int sum = 0 ; //加数------最终结果变量
for(int x = 1;x<=100;x++){ //int x = 1 1开始加数
sum += x;
}
System.out.println("0~100的值的总和是:"+sum);
}
}
3.1.3 水仙花数
定义:指的是三位数,而且每个位的立方和就是当前数据本身
eg: 153---3*3*3*+5*5*5*+1*1*1
需求:求出所有的水仙花数
分析:1)取值范围 100-999
2)确定三位数的每个位上的值
规律: int ge = x % 10;
int shi = x / 10 % 10 ;
int bai = x / 100 % 10; 或者x / 100 ;
3)只要满足条件 x = ge*ge*ge+shi*shi*shi+bai*bai*bai;
4)输出
class Shuixianhua{
public static void main(String[] args){
System.out.println("所有的水仙花数是:");
for(int x = 100 ; x <= 999 ; x++){
int ge = x % 10;
int shi = x / 10 % 10 ;
int bai = x / 100 % 10;
if(x == ge*ge*ge+shi*shi*shi+bai*bai*bai){
System.out.println(x);
}
}
}
}
3.1.3 统计思想
需求:统计所有的水仙花有多少个?
步骤:
1)定义统计变量count,从0 开始
2)水仙花数:三位数,明确范围 100-999之间x
3)确定每个数据本身
4)满足条件之后count++
if(关系式){
控制体语句
count++; //统计变量++
}
5)输出统计变量即可connt;
3.1.1 fou循环的嵌套(理解)
for(初始化语句;条件表达式;控制体语句){
循环体语句1是for循环
for(初始化语句2;条件表达式2;控制体语句2)
...循环体语句2
}
java中的转义字符 \t------制表符(必须是\)
穷举法:极限值法------假设某一个值达到最大值,则可以确定他的范围. 典型面试题:鸡兔同笼,搬砖
3.2 while循环结构语句
扩展格式:
初始化语句;
while(条件表达式){
循环体语句;
控制体语句;
}
3.2.1 while循环和for循环的区别
共同点:都能够描述循环的思想,将重复度高的代码进行优化,解决冗余度问题
不同点: 1)格式上不一样
2)从内存角度上去考虑,for循环使用完毕结束后,那么当前这个变量也就被释放掉了,而while可以访问到这个变量,所以相对来说,for循环更节省存储空间;
3)明确循环次数,优先采用for循环,再次是while循环
while循环:不明确循环次数使用
实际开发中,for循环使用最多
while循环一般是按照while(ture){}死循环中使用//当达到某种条件时,break中断
3.3 do-while循环
格式:
1)初始化语句;
do{
循环体语句;
控制体语句;
}while(条件表达式);
执行流程:
1)初始化语句执行
2)执行条件表达式,如果条件表达式不成立,循环体至少执行一次
3)如果条件表达式成立......然后控制语句,以此判断.
do-while循环和其他两个循环最大的区别就是:循环体至少循环一次;
do{
System.out.println("我喜欢高圆圆,虽然她已经42岁了") ;
x ++ ;
}while(x<=6) ;
3.4 while和for的死循环
jdk提供了一个数学运算类java.lang.Math(是一个数据工具类)
可以针对三角函数,对数,指数等等进行数学运算
Math类提供了一个方法:
public static double random():产生一个随机数[0.0,1.0) //这是一个类
double result = Math.random();随机产生一个数值
int result = (int)(Math.random()*100+1) //强转为1-100的int类型
猜字游戏
实现步骤:
1)猜1-100之间的随机数,首先得产生1-100的随机数
int 变量名 = (int)(Math.random()*100+1);
//不断录入数据,将下面的逻辑-----使用while(ture){}
2)键盘录入一个数据int-----guessNum
3)判断: 使用guessNum和产生的1-100之间的随机数进行比较;
如果大了,提示"对不起,您猜的数据大了"
如果小了,提示"对不起.您猜的数据小了"
如果一致,提示"恭喜您,猜对了"
import java.util.Scanner;
class WhileTest{
public static void main(String[] args){
System.out.println("准备开始玩游戏了....");\
int num = (int)(Math.random()*100+1);
int count = 0;
while(true){
Scanner sc = new Scanner(System.in);
count ++;
System.out.println("请您输入您猜的数据");
int guessNum = sc.nextInt();
if(guessNum>num){
System.out.println("对不起,您猜的数据大了")
}else if(quessNum < num){
System.out.println("对不起,您猜的数据小了")
}else{
System.out.println("恭喜您第"+count+"猜对了")
break;
}
}
System.out.println("游戏结束,欢迎下次光临");
}
}
格式:for循环的死循环格式
for(;;){
输出语句1
}
while循环的死循环格式:
while(ture){
输出语句2
}
二 . 跳转控制语句(重点)
跳转控制语句:break: 中断 1)不能单独使用 2)只能在两个场景中使用switch和循环中
continue;一般在循环语句中使用
1)表示停止当前循环,立即进入下一次循环
return(和方法有关系):返回一个结果,一般情况下,不会单独使,结合java中的有具体返回值类型的方法去使用,在结束方法的时候单独使用
三 什么是函数(重点)
四.引入什么是方法
在java中,方法就是使用{}代码块将一些业务包裹起来,并为之起名字,称为"方法名",“方法名"需要见名知意,使用"小驼峰命名法”;
以后直接在main方法中调用我们自己的方法即可
五.关于有返回值类型的方法使用和调用
5.1 关于有返回值类型的方法的使用
返回值类型固定写法:
权限修饰符 返回值类型 方法名(参数类型1 变量1,参数类型2 变量2.......){
代码
return 结果
}
详细解释:
权限修饰符:现在固定使用public,访问权限足够大,必须带上static;public static
返回值类型:就是数据类型----研究的就是基本数据类型
方法名:给{}起名字,见名知意,用小驼峰命名法
参数列表:
参数类型------数据类型,现在使用基本数据类型
变量名:--------给当前形式参数起名字,见名知意,用小驼峰命名法
return 结果:结合有返回值类型的方法使用
返回值类型是什么类型,就返回给你具体的结果
5.2 关于有返回值类型的方法的调用
输出调用:不建议,直接输出有返回值类型的结果,将代码硬化,不能再使用
赋值调用:建议: 将有返回值类型的方法result结果赋值给main方法的变量,result可以继续使用
单独调用:在main方法中调用,但是没有输出语句(有结果,但是没输出)
5.3 关于有返回值类型的方法的调用的执行流程
1)实际参数----后期可以键盘录入数据
2)在类中找到是否存在子方法
3)同时将实际参数ab赋值给形式参数xy
4)_业务逻辑:就是将数值求和
5)返回结果
5.4 关于有返回值类型的方法的应用场景
目前来说,就是给你一个需求,使用方法完成,将结果输出控制台展示
以后来说,前后端交互
5.5 定义有返回值类型的方法的注意事项
1)方法和方法是平级关系,不能嵌套;
2)定义方法的时候需要两个明确
1.明确返回值类型
2.明确参数返回类型以及返回个数
3)在定义方法的时候,形式参数必须携带数据类型
4)在实际参数main中,调用方法的时候,
型
5)实际参数和形式参数,传参时,数据类型要一一对应;
六.没有返回值类型的方法
6.1 无返回值类型的方法的使用
针对某个功能代码块{},没有具体的返回值类型,按照语法规定,必须有一个值,Java提供了一个关键字:代替没有具体的返回值类型void
格式:权限修饰符 返回值类型 方法名(形式参数列表){}
public static void 方法名(形式参数列表){}
方法中的内容:直接输出或者进行其他操作;不需要return操作;
6.2 无返回值类型的方法的注意事项
两个明确:
1)明确返回值类型;没有具体的返回值类型,用void代替
2)明确参数类型以及参数个数:------没有的话直接可以在方法中取规定参数
6.3 关于没有返回值类型的方法的调用
输出调用:使用不了
赋值调用:使用不了
单独调用: 只能单独调用 方法名(参数列表);
7. 数组-默认一维数组
7.1什么是数组?
定义:只能存储同一种数据类型的容器;(只能含有一种数据类型的数据)
格式: 1)数据类型[] 数组名称(推荐); int[] arr; 定义了一个int类型的数组,arr变量
2)数据类型 数组名称[]; int arr[];定义了int类型的arr数组
数组本身属于引用数据类型,里面存储的元素内容可以是同一种类型的基本类型元素或者同一种类型的引用类型.
数组也属于变量的范围;
数组的弊端:长度固定不变,无法不变
7.2 数组的初始化
初始化有两种方式:1)动态初始化
2)静态初始化
动态初始化:我们给定数组的长度.数组的元素内容由系统默认初始化
格式: 数据类型[] 数组名称 = new 数据类型[数组长度];
比如: int[] arr = new int[3] ;
解释:int : 存储类型为int类型
[] : 表示一维数组
arr : 当前数组的对象名称(变量名)
new : 创建对象
int :创建的对象是一个int类型的数组
[] : 表示创建的是一个一维数组
3 : 我们给定的数组的长度是3
获取元素格式: 通过数组名称[索引值(角标值)]
索引值从0开始
静态初始化 格式 数据类型[] 数组名称 = {元素值}; eg: int[] arr = {1,2,3,4.....}
7.3 jvm内存分配
栈内存:1)局部变量:在方法定义中或者是方法声明上的变量 特点:先进先出
堆内存:new出来的东西都在堆内存中 eg:new Scanner(System.in); new arr[3];
方法区:class:字节码文件区域
2)static区域--以后关于静态的东西
寄存器:和cpu有关
本地方法区域:和系统相关
7.4 数组的两个常见异常
在程序中出现异常.异常时一个类,以后学习常用类中的东西
1)数组角标越界异常(ArrayIndexOutOfBoundsException)---程序运行的时候异常
解决方案---改变索引值
2)实际开发中,经常会出现空指针异常(NullPointerException)--就是我们访问某个对象的时候,对象就是null
非空判断 if(sc!=null){
业务逻辑
}else{
System.out.println("数据有误") ;
}
7.5 数组的应用
1)遍历数组:就是将数组的元素值一一展现
方法:在数组中有一个 属性length,可以很快的获取数组长度
格式 数组的长度=数组名称.length
for(int x=1 ; x<array.length ; x++){
System.out.ptintln(array[x]) ;
}
2)方法重载(overload):当方法的功能都是相同的,我们可以定义同名的方法,参数列表不同,可以提高功能的扩展性
总结:方法名相同,参数列表不同,与返回值无关
参数列表不同:参数个数不同
参数类型不同
考虑参数类型的顺序
3)方法重写(override)
4)数组赋值:将第一个数组对象赋值给第三个数组,则表示数组1和数组3共用一个对象,都可以通过对象的堆内存进行访问元素值;
7.6 数组的其他应用
1. 遍历数组的时候:优雅的格式遍历
2.数组的最值问题
1)假设一个参照物作为最值 arr[x]=max ;
2)然后遍历数组,将所有元素与最大值比较,如果比参照物大,则重新赋值给max
3)最后输出max
arr[0] = max ;
for(int x=1 ; x<array.length ; x++){
if(array[x]>max){
array[x] = max ;
}
}
System.out.println("max");
3.数组的逆序
就是将数组中的第一个元素和最后一个元素互换,将第二个元素和倒数第二个元素互换,以此类推
方式一:for(int x=0 ; x/2=0; x++){
int temp = arr[x] ;
arr[x] = arr[arr.length-1-x] ;
arr[length-1-x] = temp ;
}
方式二:
for(int start=0 , int end=arr.length-1;start<end;start++,eng--){
int temp = arr[start] ;
arr[start] = arr[end] ;
arr[end] = temp ;
}
4.数组的基本查表法----字符串类型需要用字符串类型string
就是通过数组的对象名称[索引值]---获取元素内容
字符串数组: string[] weeks = {"星期一","星期二","星期三"....}
5.数组的基本元素查找法:查询数组中的元素出现的索引值
查元素第一次出现的索引值,每次从头查询到尾,这个数组既可以无序,也可以有序!
方式一:返回值类型 参数 = 方法名(实际参数列表,元素值) ;
public static int getnum(int [] array,int target)
for(int x=0 ; x<arr.length ; x++){
if(array[x] == target){
return x ;
}else{
return -1 ;
}
}
方式二(推荐);假设思想
public static int getnum(int [] array,int target)
int index = -1
for(int x=0 ; x<arr.length ; x++){
if(array[x] == target){
index = x ;
break ;
}
return index ;
}
7.7 数组的高级排序—<冒泡
排序方法----冒泡:比较稳定的一种排序方
思想:两两比较,将较大值往后放,第一次比较完毕,最大值就出现在最大索引处:然后依次就这样比较,就可以得到一个排好顺序的数组!
规律:1)两两比较,将较大值往后放,第一次比较完毕,最大值出现在了最大索引处
2)第一次比较,有0个不比
第二次比较,有1个不比
,,,,,,
比较的次数: arr.length -1 次
for(int x=0 ; x<array,length-1 ;x++){
for(int y=0;y<array,length-1-x ; y++){
if(array[x+1]<array[x]){
int temp = array[x];
array[x] = array[x+1] ;
array[x+1] = temp ;
}
}
}