课前回顾:1.Scanner:键盘录入a.导包:import java.util.Scannerb.创建对象:Scanner sc = new Scanner(System.in)c.调用方法:nextInt()录入一个整数nextDouble()录入一个小数next()录入一个字符串 遇到空格就结束nextLine()录入一个字符串 遇到回车就结束2.switch:格式:switch(变量){case 目标值1:执行语句1;break;...default:执行语句n;break}break:结束switch的case的穿透性:没有break的时候出现,就一直往下穿透执行,直到遇到break或者switch结束为止3.if:如果if(boolean表达式){执行语句}if(boolean表达式){执行语句}else{执行语句}if(boolean表达式){执行语句}else if(boolean表达式){}else{}4.循环for(初始化变量;比较;步进表达式){循环语句}a.初始化变量b.比较,如果是true,执行循环语句,步进c.再次比较,如果还是true,再次执行循环语句,如果比较失败了,for结束初始化变量while(比较){循环语句步进表达式}初始化变量do{循环语句步进表达式}while(比较);1.今日重点:a.会死循环,以及嵌套循环(执行流程)b.会使用Random在指定的范围内随机一个数c.数组静态初始化动态初始化往数组中存元素从数组中获取元素遍历数组d.会冒泡排序的编写
第一章.循环语句
3.循环的区别
1.for循环,for循环中初始化的变量,出了for循环就使用不了了(按照常用的方式去理解)2.while循环,初始化的变量出了while循环还能使用3.do...while循环,初始化的变量出了do...while循环还能使用,至少执行一次4.确定次数用for,不确定次数用while
4.循环控制关键字
break:在switch中代表结束switch语句在循环中,代表结束循环continue:在循环中,代表结束本次循环,进入到下一次循环
public class Test01 {public static void main(String[] args) {for (int i = 1; i <= 5; i++) {if (i==3){//break;//结束循环continue;//结束本次循环,进入到下一次循环}System.out.println("我爱大数据"+i);}}}
5.死循环
1.什么时候会出现死循环:判断一直为true的时候
public class Test02 {public static void main(String[] args) {//for循环的死循环int i = 0;for(;;){i++;System.out.println("我是:"+i);}//while死循环/* while(true){i++;System.out.println("我是:"+i);}*/}}
6.嵌套循环
1.循环体中还是一个循环2.执行流程:先执行外层for循环,然后进入到内层for循环,然后内层for循环就一直循环,直到内层for循环结束了;外层for循环进行第二次循环等到外层for循环也结束了,那么整体就都结束了3.开发中,尽量避免嵌套循环层数过多
public class Test03 {public static void main(String[] args) {for (int fen = 0; fen < 60; fen++) {for (int miao = 0; miao < 60; miao++) {System.out.println(fen+"分"+miao+"秒");}}}}
第二章.Random随机数
1.概述:java自带的类2.作用:在指定的范围内随机一个数3.使用:a.导包:import java.util.Randomb.创建对象Random 对象名 = new Random()c.调用方法,真正实现生成随机数nextInt()->在int范围内随机一个数nextDouble()->在0.0到1.0之间随机一个数在指定的范围内随机一个数:nextInt(int bound)->在 0- (bound-1)之间随机一个数nextInt(10)-> 在0-9之间随机问题:在1-10之间随机一个数-> nextInt(10)+1 -> (0-9)+1 -> 1-10在100-999之间随机一个数-> nextInt(900)+100 -> (0-899)+100-> 100-999
public class Test01 {public static void main(String[] args) {Random rd = new Random();double data = rd.nextDouble();System.out.println(data);}}
public class Test02 {public static void main(String[] args) {Random rd = new Random();int data1 = rd.nextInt(100) + 1;System.out.println(data1);}}
/*猜数字小游戏在1-100之间随机一个数,键盘录入一个数当做我们要猜的数字*/public class Test03 {public static void main(String[] args) {//1.创建Random对象Random random = new Random();//2.创建Scanner对象Scanner sc = new Scanner(System.in);//3.调用nextInt()随机一个数int rdNumber = random.nextInt(100) + 1;while (true) {//4.调用Scanner的nextInt方法去录入一个要猜的数字System.out.println("请你猜一个数:");int scNumber = sc.nextInt();if (scNumber > rdNumber) {System.out.println("对不起,您猜大了!");} else if (scNumber < rdNumber) {System.out.println("对不起,您猜小了!");} else {System.out.println("恭喜您,猜中了!");break;}}}}
第三章.数组的介绍以及定义
1.概述:容器2.作用:存放数据3.特点:a.定长:长度固定,数组在定义之后,后续不能改变数组的长度b.既能存储基本类型,还能存储引用类型的数据4.定义格式:a.静态初始化:数据类型[] 变量名 = new 数据类型[]{元素1,元素2,元素3...}->推荐使用数据类型 变量名[] = new 数据类型[]{元素1,元素2,元素3...}->不推荐使用简化形式:数据类型[] 变量名 = {元素1,元素2,元素3...}->静态初始化中最最推荐使用的b.动态初始化数据类型[] 变量名 = new 数据类型[数组的长度]->推荐使用数据类型 变量名[] = new 数据类型[数组的长度]->不推荐使用数据类型:决定了数组中只能存什么类型的元素[]:代表的数组变量名:见名知意new:代表的是真正的将数组创建出来了数据类型:要和等号左边的数据类型保持一致[数组的长度]:代表的是数组最多能存多少个数据5.动态初始化和静态初始化区别:动态初始化:创建的时候需要手写new,刚开始没有具体的元素存储当创建数组的时候,还不确定将来存储什么元素,只知道了个数静态初始化:创建的时候不需要手写new,刚开始就将具体的元素存进去了长度可以通过存储的元素个数来确定当创建的时候,确定了要存储什么数据
public class Test01 {public static void main(String[] args) {// 数据类型[] 变量名 = new 数据类型[]{元素1,元素2,元素3...}int[] arr = new int[]{1,2,3,4,5,6};int arr1[] = new int[]{1,2,3,4,5,6};int[] arr2 = {1,2,3,4,5,6};String[] arr3 = {"张无忌","张翠山","张三丰","赵敏","周芷若","灭绝","紫衫龙王","小昭"};//动态初始化int[] arr4 = new int[3];String[] arr5 = new String[3];}}
第四章.操作数组
1.获取数组的长度
1.格式:数组名.length2.注意:length是数组的一个属性,代表数组的长度
public class Test02 {public static void main(String[] args) {String[] arr = {"努尔哈赤","皇太极","顺治","康熙","雍正","乾隆","嘉庆","道光","咸丰","同治","光绪","宣统"};int len = arr.length;System.out.println(len);}}
2.索引
1.概述:记录元素在数组中存储的位置2.特点:索引唯一,不能重复从0开始,最大索引是:数组的长度-1 (数组名.length-1)3.注意:往数组中存数据,还是从数组中获取数据,都必须依靠索引
3.存储元素
1.格式:数组名[索引值] = 元素值->将等号右边的元素存储到数组的指定索引位置上arr[2] = 100->将100存储到arr数组的2索引上
public class Test03 {public static void main(String[] args) {int[] arr = new int[3];arr[0] = 100;arr[1] = 200;arr[2] = 300;}}
4.获取元素
1.注意:直接输出数组名,不是获取元素,会把数组在内存中的地址值输出来2.格式:数组名[索引值]3.区别存元素和获取元素如果数组名[索引值]在等号右边,代表获取元素如果数组名[索引值]在等号左边,代表存储元素
public class Test03 {public static void main(String[] args) {int[] arr = new int[3];arr[0] = 100;arr[1] = 200;arr[2] = 300;System.out.println(arr);/*先将arr数字中0索引的元素获取出来,赋值给等号左边的变量element*/int element = arr[0];int element1 = arr[1];int element2 = arr[2];System.out.println(element);System.out.println(element1);System.out.println(element2);}}
public class Test04 {public static void main(String[] args) {int[] arr = {1,2,3,4};int[] arr1 = {100,200,300,400};System.out.println(arr1[0]);//100/*先获取arr数组3索引上的元素4将4存储到arr1数组的0索引上那么arr1数组0索引上的100就被4覆盖了*/arr1[0] = arr[3];System.out.println(arr1[0]);//4}}
![day04[循环_数组] - 图1](http://ww1.sinaimg.cn/large/006bYs0Bgy1gqw3s66z04j616h0gjweo02.jpg#id=zDt1Z&originHeight=595&originWidth=1529&originalType=binary&status=done&style=none)
5.遍历数组
1.概述:将数组中的元素挨个的获取出来
public class Test05 {public static void main(String[] args) {String[] arr = {"燃灯古佛","如来佛祖","东来佛祖","斗战胜佛","旃檀功德佛","阿弥陀佛"};for (int i = 0;i<6;i++){System.out.println(arr[i]);}System.out.println("===================");for (int i = 0;i<arr.length;i++){System.out.println(arr[i]);}System.out.println("===================");for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}}
第五章.操作数组时两个常见的问题
1.数组索引越界异常->ArrayIndexOutOfBoundsException
1.出现的原因:我们操作的索引,超出了数组的索引范围
public class Test01 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};for (int i = 0; i <= arr.length; i++) {System.out.println(arr[i]);}}}
![day04[循环_数组] - 图2](http://ww1.sinaimg.cn/large/006bYs0Bgy1gqw3v5uk5ej60ru0350sz02.jpg#id=cNO9G&originHeight=113&originWidth=1002&originalType=binary&status=done&style=none)
2.空指针异常->NullPointerException
1.原因:如果数组为null,然后还操作了数组,就出现了空指针异常
public class Test02 {public static void main(String[] args) {int[] arr = {1,2,3,4};int[] arr1 = new int[3];int[] arr2 = null;System.out.println(arr2.length);}}
![day04[循环_数组] - 图3](http://ww1.sinaimg.cn/large/006bYs0Bgy1gqw3vxuro0j61630g574t02.jpg#id=amcYQ&originHeight=581&originWidth=1515&originalType=binary&status=done&style=none)
注意:
1.将来我们开发,不会故意的将一个引用数据类型置成null,如果置成null,也是作为一个初始化来使用,后续一定会为其赋上一个具体的值
2.有的时候,我们写代码时有可能会遇到空指针异常(我们无可奈何的)
比如:我们要获取一个对象,但是获取出来的对象没有被创建出来,由于没有被创建,获取出来的对象就是null,但是我们并不知道,已操作,出现了空指针异常以上两个异常:不要故意写,我们要做到,看到这两个异常,知道什么原因即可
第六章.练习
9.1练习
第一题:需求:求出数组中的元素最大值步骤:1.定义一个变量max用于拿两个元素之间较大的元素2.遍历数组,将每一个元素获取出来3.循环比较如果max的值小于遍历出来的元素,将较大的元素重新赋值给max4.直接输出max
public class Test01 {public static void main(String[] args) {int[] arr = {4,2,54,67,7};//1.定义一个变量max用于拿两个元素之间较大的元素int max = arr[0];//2.遍历数组,将每一个元素获取出来for (int i = 1; i < arr.length; i++) {/*3.循环比较如果max的值小于遍历出来的元素,将较大的元素重新赋值给max*/if (max<arr[i]){max = arr[i];}}//4.直接输出maxSystem.out.println(max);}}
9.2练习
随机产生10个[0,100]之间整数,统计既是3又是5,但不是7的倍数的个数步骤:1.创建数组,长度为102.创建Random对象,调用10次nextInt(101)3.将随机出来的数据,存到数组中4.定义一个变量,做统计 count5.遍历数组在遍历的过程中判断判断条件:arr[i]%3==0 && arr[i]%5==0 && arr[i]%7!=0如果是true,count++6.输出count
public class Test02 {public static void main(String[] args) {//1.创建数组,长度为10int[] arr = new int[10];//2.创建Random对象,调用10次nextInt(101)Random rd = new Random();//3.将随机出来的数据,存到数组中for (int i = 0; i < 10; i++) {arr[i] = rd.nextInt(101);}//4.定义一个变量,做统计 countint count = 0;/* 5.遍历数组在遍历的过程中判断判断条件:arr[i]%3==0 && arr[i]%5==0 && arr[i]%7!=0如果是true,count++*/for (int i = 0; i < arr.length; i++) {if (arr[i]%3==0 && arr[i]%5==0 && arr[i]%7!=0){count++;}}//6.输出countSystem.out.println(count);}}
9.3练习
用一个数组存储本组学员的姓名,从键盘输入,并遍历显示
步骤:1.定义一个数组 52.创建Scanner对象3.调用next()输入姓名存到数组中4.遍历数组
public class Test03 {public static void main(String[] args) {//1.定义一个数组 5String[] arr = new String[5];//2.创建Scanner对象Scanner sc = new Scanner(System.in);//3.调用next()输入姓名存到数组中for (int i = 0; i < arr.length; i++) {System.out.println("请你输入第"+(i+1)+"个学生姓名:");String name = sc.next();arr[i] = name;}//4.遍历数组for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}}
9.4练习
需求:1.定义一个数组 int[] arr = {1,2,3,4}2.遍历数组,输出元素按照[1,2,3,4]
public class Test04 {public static void main(String[] args) {int[] arr = {1,2,3,4};//[1,2,3,4]System.out.print("[");for (int i = 0; i < arr.length; i++) {//判断如果i的值变化到最大索引了,证明要输出的是最后一个元素,最后一个元素输出之后,后面直接跟]if (i==arr.length-1){System.out.print(arr[i]+"]");}else{System.out.print(arr[i]+",");}}System.out.println();System.out.println(Arrays.toString(arr));}}
9.5练习
键盘录入一个整数,找出整数在数组中存储的位置步骤:1.创建一个数组,存元素2.创建Scanner对象3.调用nextInt()键盘录入一个整数4.遍历数组,判断如果遍历出来的元素==录入的整数,直接将对应的索引输出
public class Test05 {public static void main(String[] args) {//1.创建一个数组,存元素int[] arr = {11,22,33,44,55};//2.创建Scanner对象Scanner sc = new Scanner(System.in);//3.调用nextInt()键盘录入一个整数int data = sc.nextInt();//4.遍历数组,判断如果遍历出来的元素==录入的整数,直接将对应的索引输出//定义一个变量,表示是否有要查找的数据int index = 0;for (int i = 0; i < arr.length; i++) {if (arr[i]==data){index++;System.out.println(i);}}/*判断,index如果还是0,证明for循环中的if语句一次都没走if一次都没走,证明数组中根本就不存在要查找的数据*/if (index==0){System.out.println(-1);}}}
第七章.内存
===============================================================栈(Stack)专门运行方法的方法的运行会进栈运行->压栈方法运行完毕->弹栈堆(Heap)我们new出来的对象都会在堆内存中出现我们每new一次,在堆内存中就会产生一片空间,并为这个空间赋一个地址值而且,堆内存中的数据都是有默认值的:整数:0小数:0.0字符:'\u0000'布尔:false引用:null方法区(Method Area)我们的代码程序运行之前,会被jvm中的类加载器(ClassLoader)加载到内存中方法区就记录着类的信息 和方法的信息当方法区中的方法被调用时,方法会从方法区中出来进栈运行===============================================================本地方法栈(Native Method Stack)专门运行native方法的本地方法,是C语言写的,C语言没有对我们开源,所以我们看不到方法体寄存器(pc register)和CPU有关
1.一个数组在内存中如何存储
public class Test01 {public static void main(String[] args) {int[] arr = new int[3];System.out.println(arr);//地址值System.out.println(arr[1]);//0arr[1] = 10;System.out.println(arr[1]);//10}}
![day04[循环_数组] - 图4](http://ww1.sinaimg.cn/large/006bYs0Bgy1gqw3wu62r6j615p0i2q3u02.jpg#id=hrxrs&originHeight=650&originWidth=1501&originalType=binary&status=done&style=none)
2.两个数组内存图
创建了两个数组,开辟了两个不同的空间改变一个空间的数据,不会 影响到另外一个空间中的数据public class Test02 {public static void main(String[] args) {int[] arr1 = new int[3];System.out.println(arr1);//地址值arr1[1] = 10;System.out.println(arr1[1]);//10int[] arr2 = new int[3];System.out.println(arr2);//地址值arr2[1] = 100;System.out.println(arr2[1]);//100}}
![day04[循环_数组] - 图5](http://ww1.sinaimg.cn/large/006bYs0Bgy1gqw3xcslkhj61630ib75t02.jpg#id=neBha&originHeight=659&originWidth=1515&originalType=binary&status=done&style=none)
3.两个数组指向同一个空间
public class Test03 {public static void main(String[] args) {int[] arrA = new int[3];System.out.println(arrA);arrA[1] = 10;int[] arrB = arrA;System.out.println(arrB);arrB[1] = 100;System.out.println(arrA[1]);System.out.println(arrB[1]);}}arrB是arrA给的,由于arrA保存的是地址值,所以arrB的地址值和arrA的地址值是一样的,所以arrB和arrA在内存中指向的是同一片空间,同一个数组,所以改变arrB也会影响到arrA9
![day04[循环_数组] - 图6](http://ww1.sinaimg.cn/large/006bYs0Bgy1gqw3xwlc7vj616l0ibq4102.jpg#id=qahOJ&originHeight=659&originWidth=1533&originalType=binary&status=done&style=none)
