day04.java循环_数组
今日重点:
1.会使用死循环,嵌套循环
2.会使用Random在指定的范围内随机一个整数
3.知道数组的作用以及特点
4.知道数组怎么定义(静态初始化,动态初始化)
5.会数组的操作(定义,存,取,遍历)
6.知道操作数组时容易出现的异常问题
第一章.while
1.1while练习
需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度? 27
步骤:
1.定义一个变量,表示山峰的高度 mountain
2.定义一个变量,表示纸的厚度 paper
3.定义一个变量,统计折纸次数 count
4.循环比较,如果纸的厚度小于山峰高度,我们就折(在原来纸的厚度的基础上*2)
5.折一次,count++
public class Demo01While {
public static void main(String[] args) {
//1.定义一个变量,表示山峰的高度 mountain
int mountain = 8844430;
//2.定义一个变量,表示纸的厚度 paper
double paper = 0.1;
//3.定义一个变量,统计折纸次数 count
int count = 0;
//4.循环比较,如果纸的厚度小于山峰高度,我们就折(在原来纸的厚度的基础上*2)
while(paper<mountain){
paper*=2;//paper = paper*2;
//5.折一次,count++
count++;
}
System.out.println("count = " + count);
}
}
2.do…while循环(了解)
1.格式:
初始化变量;
do{
循环语句
步进表达式
}while(比较);
2.执行流程:
a.初始化变量
b.循环语句
c.步进表达式
d.比较,如果是true,继续循环,知道比较为false,循环结束
3.特点:
至少执行一次
4.示例:
用do… while 语句打印10遍“我爱java”
public class Demo02DoWhile {
public static void main(String[] args) {
int i = 0;
do{
System.out.println("我爱java");
i++;
}while(i<10);
}
}
3.循环的区别
1.for循环中初始化的变量,出了for循环作用域就使用不了。
2.while循环中初始化的变量,出了while作用域还能使用。
3.do...while至少执行一次
4.循环控制关键字
4.1 两个关键字
break:
a.在switch中break代表结束switch
b.在循环中,结束循环
continue:
结束本次循环,进行下一次循环
4.2 示例
public class Demo01BreakAndContinue {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
if (i==3){
//break;//结束循环
continue;//结束本次循环进入下一次循环
}
System.out.println("我爱java"+i);
}
}
}
5.死循环
5.1.概述:
- 一直循环下去
5.2.条件:
- 比较结果永远是true
5.3.示例
public class Demo01DieFor {
public static void main(String[] args) {
int i = 0;
for(;;){
i++;
System.out.println("我爱java"+i);
}
/* while(true){
i++;
System.out.println("我爱java"+i);
}*/
}
}
6.嵌套循环
6.1 概述:
循环中还有循环
6.2 执行流程:
先走外层循环,再走内层循环,内层循环就一直循环,直到内层循环结束了,外层循环进入到下一次循环,直到外层循环都结束了,整体就结束了
6.3 示例:
public class Demo01ForInFor {
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+"秒");
}
}
}
}
练习:打印矩形
public class Demo02ForInFor {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
System.out.print("* ");
}
System.out.println();
}
}
}
练习:打印直角三角形
*
**
***
****
*****
public class Demo03ForInFor {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i; j++) {
System.out.print("* ");
}
System.out.println();
}
}
}
第二章.Random随机数
概念
1.学习方式:和Scanner一样
1.概述:java自带的一个类
2.作用:在指定的范围内随机一个整数
3.使用:
a.导包: import java.util.Random
b.创建对象: Random 对象名 = new Random()
c.调用方法,实现生成随机数
对象名.nextInt() -> 在int取值范围内随机一个数
对象名.nextInt(int bound) -> 在0-(bound-1)之间随机一个整数
对象名.nextDouble()-> 在0.0到1.0之间随机
示例
public class Demo01Random {
public static void main(String[] args) {
Random rd = new Random();
int data1 = rd.nextInt();
System.out.println("data1 = " + data1);
System.out.println("===================");
double data2 = rd.nextDouble();
System.out.println("data2 = " + data2);
}
}
在1-10之间随机一个数: nextInt(10)+1 -> (0-9)+1 -> 1-10
在1-100之间随机一个数: nextInt(100)+1 -> (0-99)+1 -> 1-100
在100-999之间随机一个数: nextInt(900)+100 -> (0-899)+100 -> 100-999
public class Demo02Random {
public static void main(String[] args) {
Random rd = new Random();
int data1 = rd.nextInt(10);
System.out.println("data1 = " + data1);
System.out.println("=================");
//在1-10之间随机一个数: nextInt(10)+1 -> (0-9)+1 -> 1-10
int data2 = rd.nextInt(10)+ 1;
System.out.println("data2 = " + data2);
System.out.println("=================");
//在1-100之间随机一个数: nextInt(100)+1 -> (0-99)+1 -> 1-100
int data3 = rd.nextInt(100) + 1;
System.out.println("data3 = " + data3);
System.out.println("=================");
//在100-999之间随机一个数: nextInt(900)+100 -> (0-899)+100 -> 100-999
int data4 = rd.nextInt(900) + 100;
System.out.println("data4 = " + data4);
}
}
练习
需求:完成一个猜数字小游戏
步骤:
1.创建Random和Scanner对象
2.调用Random中的nextInt方法随机一个数 rdNumber
3.调用Scanner中的nextInt方法键盘录入一个数 scNumber
4.如果scNumber>rdNumber,证明猜大了
5.如果scNumber<rdNumber,证明猜小了
6.如果scNumber=rdNumber,证明猜中了
public class Demo03Random {
public static void main(String[] args) {
//1.创建Random和Scanner对象
Random rd = new Random();
Scanner sc = new Scanner(System.in);
//2.调用Random中的nextInt方法随机一个数 rdNumber
int rdNumber = rd.nextInt(900) + 100;
while (true) {
//3.调用Scanner中的nextInt方法键盘录入一个数 scNumber
System.out.println("请您猜一个数:");
int scNumber = sc.nextInt();
//4.如果scNumber>rdNumber,证明猜大了
//5.如果scNumber<rdNumber,证明猜小了
//6.如果scNumber=rdNumber,证明猜中了
if (scNumber > rdNumber) {
System.out.println("对不起,您猜大了!");
} else if (scNumber < rdNumber) {
System.out.println("对不起,您猜小了!");
} else {
System.out.println("恭喜您,中奖了!中了一个大嘴巴子!");
break;
}
}
}
}
第三章.数组的介绍以及定义
概念
1.概述:容器,数组本身属于引用数据类型
2.特点:
a.可以存储多个相同数据的类型,存储类型可以基本数据类型,也能存储引用类型数据。
b.定长(在定义数组的时候,长度定多长,就意味着最多能存多少个数据,后续不能更改数组的长度)
3.定义格式:
a.动态初始化:
数据类型[] 数组名 = new 数据类型[数组的长度]
数据类型 数组名[] = new 数据类型[数组的长度]
动态初始化各部分解释:
数据类型:规定了数组中存储元素的数据类型
[]:代表的是数组,一个[]代表一维数组
数组名:见名知意
new:创建数组,代表真正将数组创建了出来
数据类型:和等号前面的数据类型保持一致
[数组的长度]:规定数组最多能存多少个数据(元素)
b.静态初始化:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2...}->不推荐
数据类型 数组名[] = new 数据类型[]{元素1,元素2...}->不推荐
c.简化静态初始化:
数据类型[] 数组名 = {元素1,元素2...} -> 推推荐
示例
public class Demo01Array {
public static void main(String[] args) {
//动态初始化
int[] arr1 = new int[3];
String[] arr2 = new String[3];
//静态初始化
int[] arr3 = {1,2,3,4,5};
String[] arr4 = {"黑猫警长","百变小樱","天线宝宝","熊出没","巴啦啦小魔仙","灌篮高手","网球王子","七龙珠"};
}
}
第四章.操作数组
1.获取数组的长度
格式:
数组名.length
注意:length后面不要加小括号,因为length不是一个方法,而是数组的一个属性
public class Demo02Array {
public static void main(String[] args) {
String[] arr = {"立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑"
,"大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至","小寒","大寒"};
int length = arr.length;
System.out.println("length = " + length);
}
}
2.索引
1.概述:元素在数组中的存储位置(可以看做是每一个元素的编号,下标)
2.特点:
a.索引从0开始,最大索引为(数组长度-1)
b.索引唯一
3.注意:
我们以后存储元素,获取元素都是根据索引来操作
3.存储元素
1.格式:
数组名[索引值] = 值 -> 将等号右边的值保存到数组中指定索引位置上
arr[0] = "张三"
public class Demo03Array {
public static void main(String[] args) {
String[] arr1 = new String[3];
arr1[0] = "杨过";
arr1[1] = "小龙女";
arr1[2] = "尹志平";
int[] arr2 = new int[3];
arr2[0] = 100;
arr2[1] = 200;
arr2[2] = 300;
}
}
public class Demo04Array {
public static void main(String[] args) {
String[] arr = new String[3];
Scanner sc = new Scanner(System.in);
//方法一:
//1.1通过键盘入录形式保存数据
//String data1 = sc.next();
//String data2 = sc.next();
//String data3 = sc.next();
//1.2将保存数据赋值指定数组索引位置上。
//arr[0] = data1;
//arr[1] = data2;
//arr[2] = data3;
//方法二:键盘录入完直接值赋值给数组索引位置上
//arr[0] = sc.next();
//arr[1] = sc.next();
//arr[2] = sc.next();
//通过for循环形式入录值
/*for (int i = 0; i < 3; i++) {
arr[i] = sc.next();
}*/
//优化:原本手动指定数组的长度,改为自动获取长度
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.next();
}
}
}
//通过Random方法产生随机数给数组赋值。
public class Demo05Array {
public static void main(String[] args) {
int[] arr = new int[3];
Random rd = new Random();
for (int i = 0; i < arr.length; i++) {
arr[i] = rd.nextInt(10);
}
}
}
public class Demo06Array {
public static void main(String[] args) {
int[] arr1 = {1,2,3,4,5};
//定义一个数组arr2,将arr1中的元素复制到arr2中
//创建一个长度为5的arr2数组
int[] arr2 = new int[arr1.length];
//arr2[0] = arr1[0]; //将arr1的0索引位置上的元素赋值到arr2数组的0索引上
//arr2[1] = arr1[1];
//arr2[2] = arr1[2];
//arr2[3] = arr1[3];
//arr2[4] = arr1[4];
for (int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
}
}
4.获取元素
1.注意:我们写得代码,以及代码中包含的数据算是一个一个的应用程序,应用程序运行起来就肯定会进入到内存中,内存会为这些数据开辟一个一个的内存空间,并为其自动分配一个唯一标识,这个唯一标识叫做->地址值
2.获取元素格式:
数组名[索引值]
3.注意:
a.直接输出数组名,输出的为内存地址
b.数组中的元素都是有默认值的
整数: 0
小数: 0.0
字符: '\u0000' -> 代表空白字符,对应的int值为0
布尔: false
引用: null
public class Demo07Array {
public static void main(String[] args) {
int[] arr1 = new int[3];
System.out.println(arr1[0]);//默认值0
System.out.println(arr1[1]);//默认值0
System.out.println(arr1[2]);//默认值0
arr1[0] = 100;
arr1[1] = 200;
arr1[2] = 300;
System.out.println(arr1);
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
}
}
public class Demo08Array {
public static void main(String[] args) {
String[] arr = new String[3];
System.out.println(arr[0]);//null
System.out.println(arr[1]);//null
System.out.println(arr[2]);//null
arr[0] = "张三丰";
arr[1] = "张翠山";
arr[2] = "张无忌";
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
5.遍历数组
1.遍历:
将元素一个一个从数组中获取出来
public class Demo09Array {
public static void main(String[] args) {
String[] arr = {"许嵩","张杰","周杰伦","胡歌","郑源"};
for (int i = 0; i < 5; 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("==============");
/*
遍历快捷键
数组名.fori
*/
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
遍历快捷键:
数组名.fori
第五章.操作数组时两个常见的问题
1.数组索引越界异常->ArrayIndexOutOfBoundsException
1.原因:
操作的索引超出了数组索引范围
public class Demo10Array {
public static void main(String[] args) {
//数组索引越界异常-> ArrayIndexOutOfBoundsException
int[] arr = {1,2,3,4,5};
/* for (int i = 0; i <= arr.length; i++) {
System.out.println(arr[i]);
}*/
System.out.println("================");
int[] arr1 = new int[3];
arr1[0] = 100;
arr1[1] = 200;
arr1[2] = 300;
arr1[3] = 400;//越界,因为arr1没有3索引
}
}
2.空指针异常_NullPointerException
1.原因:
当引用为null时,还操作了此数据
public class Demo11Array {
public static void main(String[] args) {
int[] arr = {1,2,3};
System.out.println(arr.length);
System.out.println("============");
arr = null;
System.out.println(arr.length);
}
}
以上两个问题:我们需要知道原因即可
第六章.数组内存
1.内存:指的是运行内存
开发出来的程序,以及程序中的数据都会在内存中出现,都会占用内存
2.在java的世界里,将内存划分成了5块
堆(Heap)(掌握)
每new一次,都会进堆,会在堆内存中开辟一个空间,堆内存会为此空间分配一个地址值
而且在堆内存中的数据都是有默认值的
整数:0
小数:0.0
布尔:false
字符:'\u0000'
引用:null
堆内存中的数据如果没有用了,jvm会认为此数据是垃圾,此时会调用gc(垃圾回收器),将其清理回收
栈(Stack)(掌握)
专门运行方法的,所有方法的运行都会进栈运行
方法运行,自动进栈,方法运行完毕,自动弹栈
方法区(Method Area)(掌握)
可以将方法区看做成是代码运行的"预备区"
本地方法栈(Native Method Stack)(了解)
专门存本地方法的:方法上带native关键字
本地方法不是我们写的,是c语言写的,c语言没有对我们开源,所以本地方法看不到具体实现
有很多功能java实现不了,本地方法可以看做是对java功能的一个扩充
寄存器(pc Register)(了解中的了解中的了解) : 和CPU有关
1.一个数组内存图
2.两个数组内存图
arr1和arr2是两个不同的空间,修改一个空间的数据不会影响另外一个空间中的数据
3.两个数组指向同一片内存空间
arr2是arr1赋值的,在内存中arr1保存的地址值
那么arr2的地址值肯定也和arr1一样
此时arr1和arr2保存的是同样的地址值
指向的是堆内存中的同一片空间
操作的是同一个数组
所以修改一个数组的数据会影响另外一个数组的数据
第七章.练习
7.1练习
第一题:需求:求出数组中的元素最大值
步骤:
1.创建数组,存储数据
2.定义一个变量,接收第一个元素 max
3.遍历数组,将每一个元素获取出来
4.用max和遍历出来的元素比较,如果遍历出来的大,将大的元素重新赋值给max
5.输出max
public class Demo01GetMax {
public static void main(String[] args) {
// 1.创建数组,存储数据
int[] arr = {5,3,5,6,8,4,5,7};
// 2.定义一个变量,接收第一个元素 max
int max = arr[0];
// 3.遍历数组,将每一个元素获取出来
for (int i = 1; i < arr.length; i++) {
// 4.用max和遍历出来的元素比较,如果遍历出来的大,将大的元素重新赋值给max
if (max<arr[i]){
max = arr[i];
}
}
// 5.输出max
System.out.println("max = " + max);
}
}
7.2练习
随机产生10个[0,100]之间整数,统计既是3又是5,但不是7的倍数的个数
import java.util.Random;
public class Demo01{
public static void main(String[] args) {
//生成随机数对象
Random rd = new Random();
//定义静态一维数组长度为10
int[] arrInt = new int[10];
//记录符合要求的计算
int num = 0;
for (int i = 0; i < arrInt.length; i++) {
int tempNum = rd.nextInt(100) + 1;
System.out.println(tempNum);
if((tempNum % 3 == 0 && tempNum % 5 == 0) && tempNum % 7 != 0){
arrInt[i] = tempNum;
System.out.println("符合要求"+arrInt[i]);
num++;
}
}
System.out.println("符合条件的个数有:"+num+"个");
}
}
7.3练习
用一个数组存储本组学员的姓名,从键盘输入,并遍历显示
public class Demo02{
//用一个数组存储本组学员的姓名,从键盘输入,并遍历显示
public static void main(String[] args) {
String[] Name = new String[5];
Scanner sc = new Scanner(System.in);
for (int i = 0; i < Name.length; i++) {
System.out.print("请输入第"+(i+1)+"名");
Name[i] = sc.next();
}
//输出
for (int i = 0; i < Name.length; i++) {
System.out.println(Name[i]);
}
}
}
7.4练习
需求:
1.定义一个数组 int[] arr = {1,2,3,4}
2.遍历数组,输出元素按照[1,2,3,4]
public static void main(String[] args) {
/*
需求:
1.定义一个数组 int[] arr = {1,2,3,4}
2.遍历数组,输出元素按照[1,2,3,4]
*/
int[] arr = {1,2,3,4};
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if(i != arr.length-1 ){
System.out.print(",");
}
}
System.out.print("]");
}
7.5练习
键盘录入一个整数,找出整数在数组中存储的索引位置
public static void main(String[] args) {
/*
int[] arr = {10,7,8,25,68,3,99,22,77,66,125}
需求:键盘录入一个整数,找出整数在数组中存储的索引位置
*/
int[] arr = {10,7,8,25,68,3,99,22,77,66,125};
Scanner sc = new Scanner(System.in);
System.out.print("入录一位整数:");
int numInt = sc.nextInt();
for (int i = 0; i < arr.length; i++) {
if(numInt == arr[i]){
System.out.println(numInt+"对应索引位置"+i);
}
}
}