课前回顾:
1.Scanner:键盘录入
a.导包:import java.util.Scanner
b.创建对象: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.Random
b.创建对象
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.格式:
数组名.length
2.注意:
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
}
}
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]);
}
}
}
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);
}
}
注意:
1.将来我们开发,不会故意的将一个引用数据类型置成null,如果置成null,也是作为一个初始化来使用,后续一定会为其赋上一个具体的值
2.有的时候,我们写代码时有可能会遇到空指针异常(我们无可奈何的)
比如:我们要获取一个对象,但是获取出来的对象没有被创建出来,由于没有被创建,获取出来的对象就是null,但是我们并不知道,已操作,出现了空指针异常
以上两个异常:不要故意写,我们要做到,看到这两个异常,知道什么原因即可
第六章.练习
9.1练习
第一题:需求:求出数组中的元素最大值
步骤:
1.定义一个变量max用于拿两个元素之间较大的元素
2.遍历数组,将每一个元素获取出来
3.循环比较
如果max的值小于遍历出来的元素,将较大的元素重新赋值给max
4.直接输出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.直接输出max
System.out.println(max);
}
}
9.2练习
随机产生10个[0,100]之间整数,统计既是3又是5,但不是7的倍数的个数
步骤:
1.创建数组,长度为10
2.创建Random对象,调用10次nextInt(101)
3.将随机出来的数据,存到数组中
4.定义一个变量,做统计 count
5.遍历数组
在遍历的过程中判断
判断条件:
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.创建数组,长度为10
int[] 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.定义一个变量,做统计 count
int 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.输出count
System.out.println(count);
}
}
9.3练习
用一个数组存储本组学员的姓名,从键盘输入,并遍历显示
步骤:
1.定义一个数组 5
2.创建Scanner对象
3.调用next()输入姓名存到数组中
4.遍历数组
public class Test03 {
public static void main(String[] args) {
//1.定义一个数组 5
String[] 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]);//0
arr[1] = 10;
System.out.println(arr[1]);//10
}
}
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]);//10
int[] arr2 = new int[3];
System.out.println(arr2);//地址值
arr2[1] = 100;
System.out.println(arr2[1]);//100
}
}
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