CSDN 同C语言的流程同
1、补充:
1、switch使用时的注意事项
1、表达式只能是byte、short、int、char,JDK5开始支持枚举,JDK7开始支持String、不支持double、float、long
switch里面是做分支匹配,也就是可以出现很多分支,如果弄得范围很大,不可能出现这么多分支,int的范围都很大了,所以没有必要long搞这么多分支 。
double类型的数据它运算的时候可能是不精确的
默认double运算是不精确的,正是由于double运算不精确,自己计算的时候肯定会以为b是等于0.3,里面自己就会写个case 0.3;,但是这个b最后算出来的结果不是0.3,走不了这个分支,所以Java知道有这个问题,索性不支持double类型。
2、case给出的值不允许重复,且只能是字面量,不能是变量
会不知道走哪个分支,会冲突
以为这个变量的值是可以改的,万一这个d改成了20呢,又跟下面的重复报错吗,不会的,所以就要一个确定值,定死了。
2、while循环和for循环
知道循环几次用for,不知道循环几次建议用while
案例:纸张折叠成珠穆朗玛峰的高度
需求:世界上最高山峰珠穆朗玛峰高度是:8848.86米=8848860毫米,假如我有一张足够大的纸,它的厚度时0.1毫米。请问:该纸折叠多少次,可以折成珠穆朗玛峰的高度,
一开始不知道要循环多少次使用while
分析:
1、定义变量存储珠穆朗玛峰的高度,纸张的高度
2、使用while循环来控制纸张折叠,循环条件是(纸张厚度<山峰高度),循环每执行一次,就代表纸张折叠一次,并把纸张厚度变为原来的两倍。
3、循环外定义计数变量count,循环每折叠一次纸张,让count变量+1;
package com.branch;
public class WhileTest2 {
public static void main(String[] args) {
double peakHeight=8848860;
double paperThickness=0.1;
int count=0;
while(paperThickness<peakHeight)
{
paperThickness=paperThickness*2;
count++;
}
System.out.println("需要折叠" + count + "次");
System.out.println("最终纸张的厚度" + paperThickness);
}
}
2.Random的使用
作用:生成随机数
package com.random;
import java.util.Random;
public class RandomDemo1 {
public static void main(String[] args) {
//1、导包
//2、创建一个Random对象,用于生成随机数
Random r=new Random();
//3、调用Random提供的功能:nextInt得到随机数
for (int i=0;i<=20;i++) //控制下面这串代码重复执行20次
{
int data=r.nextInt(10);//0~9
System.out.println(data);
}
}
}
结果:
注意:
- nextInt(n)功能只能生成:0~n-1之间的随机数,不包含n ((10):0,1,2,3,4,5,6,7,8,9)
Random生成指定区间随机数
例如:要生成1~10之间的随机数。
结果:
补充:
可以直接写区间
int data3=r.nextInt(10,31);//10-30
3、案例:猜数字游戏
需求
- 随机生成一个1-100之间的数据,提示用户猜测,猜大提示过大,猜小提示过小,直到猜中结束游戏。
分析:
1、先随机生成一个1-100之间的数据
2、定义一个死循环让用户可以一直猜测
3、在死循环中,每次提示用户输入一个猜测的数字,猜大提示过大,猜小提示过小,猜中则结束游戏。
package com.random;
import java.util.Random;
import java.util.Scanner;
public class RandomTset2 {
public static void main(String[] args) {
//1、随机产生1-100
Random r=new Random();
int luckNumber=r.nextInt(100)+1;
//2、定义一个死循环让用户可以一直猜测
Scanner sc=new Scanner(System.in);
while(true)
{
System.out.println("请输入你猜测的数据");
//接收用户输入的数据,用扫描器
int guessNumber=sc.nextInt();
//3、判断用户猜测的数字与luckNumber的大小情况
if(guessNumber>luckNumber)
{
System.out.println("猜测的过大");
}
else if(guessNumber<luckNumber)
{
System.out.println("猜测的过小");
}
else
{
System.out.println("猜对了");
break;//结束死循环
}
}
}
}
4、数组
4.1数组的定义和访问
4.1.1 静态初始化数组
静态初始化数组:定义数组的时候直接给数组赋值
静态初始化数组的格式:
注意:
- “数据类型[ ] 数组名”也可以写成“数据类型 数组名[ ]”
- 什么类型的数组只能存放什么类型的数据
package com.define;
public class ArrayDemo1 {
public static void main(String[] args) {
//静态初始化数组
//1、数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3......}
int[] age= new int[]{10,28,15,18};
double[] scorces = new double[]{89.5,99.5,68.5,99};
//2、简化版
//数据类型[] 数组名 = {元素1,元素2,元素3......}
int[] age1= {10,28,15,18};
double[] scorces1 ={89.5,99.5,68.5,99};
//“数据类型[ ] 数组名”也可以写成“数据类型 数组名[ ]”
int age2[] = {10,28,15,18};
double scorces2[] ={89.5,99.5,68.5,99};
}
}
数组在计算机中的基本原理
注意:数组变量名中存储的是数组在内存中的地址,数组是一种引用数据类型
4.1.1.1数组的访问
数组名[索引] (索引也就是C语言中数组的下标)
数组的长度属性:length
//获取数组的长度(也就是数组元素的个数)
System.out.println(age.length);//3
package com.define;
public class ArrayDemo2 {
public static void main(String[] args) {
int[] arr={12,34,24};
//1、访问数组的全部数据
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//System.out.println(arr[3]);//会越界
System.out.println("---------------------------------------");
//2、修改数组中的数据
arr[0]=66;
arr[2]=100;
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println("---------------------------------------");
//3、访问数组的元素个数:数组名.length
System.out.println(arr.length);
System.out.println("---------------------------------------");
//技巧:获取数组的最大索引 数组名.length-1 前提是数组中存在数据
System.out.println(arr.length - 1);
}
}
结果:
4.1.1.2数组的遍历
遍历:就是一个一个数据的访问
求和、元素搜索、找最大值、找最小值等情况下会用到数组的遍历
package com.define;
public class ArrayDemo3 {
public static void main(String[] args) {
int[] ages={15,36,23};
// 0 1 2
/*System.out.println(ages[0]);
System.out.println(ages[1]);
System.out.println(ages[2]);*/
/*for(int i=0;i<3;i++)
{
//i=0,1,2
System.out.println(ages[i]);
}*/
for(int i=0;i< ages.length;i++)
{
//i=0,1,2
System.out.println(ages[i]);
}
//技巧
for (int i = 0; i < ages.length; i++) {
}
}
}
4.1.1.3案例训练
数组遍历--求和
需求:
- 某部门5名员工的销售额分别是16、26、36、6、100,请计算出他们部门的总销售额
分析:
1、把这5个数据拿到程序中去 -->使用数组
2、遍历数组中的每个数据,然后在外面定义求和变量把他们累加起来
package com.define;
public class ArrayDemo4 {
public static void main(String[] args) {
//1、定义一个数组存储5名员工的销售额
int[] money={16,26,36,6,100};
// 0 1 2 3 4
//3、定义一个变量用于累加求和
int sum=0;
//2、遍历数组中的每个数据
for (int i = 0; i < money.length; i++) {
sum+=money[i];
}
System.out.println("员工的销售总额:" + sum);
}
}
结果:
4.1.2动态初始化数组
数组的动态初始化:定义数组的时候先不加入具体的元素值,只确定数组存储的数据类型和长度
数组的动态初始化的格式:
数据类型[ ] 数组名 = new 数据类型[长度];
int[ ] arr = new int[3];
先往里面存默认值,int类型默认值是0
后赋值
arr[0]=10;
System.out.println(arr[0]);//10
提示:
静态初始化和动态初始化数组的写法是独立的,不可以混用。
动态初始化数组元素默认规则:
把这个字符(chars[0])取出来之后,把他转成真正的数据,int类型
适合场景:
- 动态初始化:适合开始不知道具体元素值,只知道元素个数的场景
- 静态初始化:适合一开始就知道要存入哪些元素值得场景
案例训练
需求:
- 某歌唱比赛,需要开发一个系统:可以录入6名评委的打分,录入完毕后立即输出平均分作为选手得分。
分析:
1、 6名评委的打分是后期录入的,一开始不知道具体分数-->动态初始化的数组存分数
2、遍历数组中的每个位置,每次提示用户录入一个评委的分数,并存入到数组对应的位置
3、遍历数组元素求和,最终得到的值算平均分打印出来
package com.define;
import java.util.Scanner;
public class ArrayTest6 {
public static void main(String[] args) {
//1、
double[] scores=new double[6];
//2、
Scanner sc=new Scanner(System.in);
for (int i = 0; i < scores.length; i++) {
//i= 0 1 2 3 4 5
System.out.println("请您输入当前第" + (i + 1) + "名评委的分数");
double score=sc.nextDouble();
scores[i]=score;
}
//3、
double sum=0;
for (int i = 0; i < scores.length; i++) {
sum+=scores[i];
}
System.out.println("选手最终得分是:" + sum / scores.length);
}
}
结果:
4.2数组的内存执行原理
1、数组的执行原理,Java程序的执行原理
Java内存分配介绍:
- 方法区
- 栈
- 堆
- 本地方法栈
- 程序计数器
运行一个Java程序,主要看JVM中包含的方法区、栈内存、堆内存这三个内存区域
2、多个变量指向同一个数组的问题
执行原理:
当两个变量指向同一个对象时,前一个过来修改,后一个再过来时可以看到修改后的对象
如果某个数组变量存储的地址是null,那么该变量将不会再指向任何数组对象。
5、数组案例
5.1数组求最值
案例:数组元素求最大值
实现步骤:
- 把颜值数据拿到程序中去,用数组装起来
- 定义一个变量用于记录最终的的最大值 max 建议存储数组的第一个元素作为参照
- 从第二个位置开始:遍历数组的数据,如果遍历的当前数据大于max变量存储的数据,则替换变量存储的数据为当前数据。
- 循环结束后输出max变量即可
package com.demo;
public class Test1 {
public static void main(String[] args) {
//1、
int[] faceScores={15,9000,10000,20000,9500,-5};
//2、
int max=faceScores[0];
//3、
for (int i = 1; i < faceScores.length; i++) {
//i=1 2 3 4 5
if(faceScores[i]>max)
{
max=faceScores[i];
}
}
System.out.println("最高颜值是:" + max);
}
}
结果:
5.2数组反转
需求:
- 某个数组有5个数据:10,20,30,40,50,请将这个数组中的数据进行反转
[ 10 20 30 40 50 ] 反转后 [ 50 40 30 20 10 ]
分析:
- 数组的反转操作实际上就是:依次前后交换数据即可实现
具体操作类似 http://t.csdnimg.cn/UYm7l
里面的字符串逆序
package com.demo;
public class Test2 {
public static void main(String[] args) {
//1、准备数组
int[] arr ={10,20,30,40,50};
// i j
//2、定义两个变量,一个在前,一个在后
for (int i = 0,j=arr.length-1; i < j; i++,j--) {
//arr[i] arr[j]
//交换
//1、定义一个临时变量记住最后一个位置处的值
int temp=arr[j];
//2、把前一个位置处的值给后一个位置
arr[j]=arr[i];
//3、把临时变量中记住的最后一个位置处的值赋值给前一个位置处
arr[i]=temp;
}
//3、遍历数组中的每个数据,看是否反转成功了
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
结果:
5.3随机排名
需求:
- 某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。请依次录入5名员工的工号,然后展示处一组随机的排名顺序。
分析
1、录入5名员工工号存储---> 使用动态初始化数组
2、依次遍历数组中的每个数据
3、每遍历到一个数据,都随机一个索引值出来,让当前数据与该索引位置处的数据进行交换
4、遍历数组中的工号输出
package com.demo;
import java.util.Random;
import java.util.Scanner;
public class Test3 {
public static void main(String[] args) {
//1、
int[] codes=new int[5];
//[0 0 0 0 0]
// 0 1 2 3 4
//2、
Scanner sc=new Scanner(System.in);
for (int i = 0; i < codes.length; i++) {
//i= 0 1 2 3 4
System.out.println("请输入当前第" + (i + 1) + "个员工的工号");
int code=sc.nextInt();
codes[i]=code;
}
//3、打乱数组中元素的顺序
//每遍历到一个数据,都随机一个数组索引范围内的值,然后让当前遍历的数据与该索引位置处的值交换
Random r=new Random();
for (int i = 0; i < codes.length; i++) {
int index=r.nextInt(5);//0-4
int temp=codes[index];
codes[index]=codes[i];
codes[i]=temp;
}
//4、
for (int i = 0; i < codes.length; i++) {
System.out.print(codes[i] + " ");
}
}
}
结果:
补充知识:Debug工具的使用
Debug工具
- IDEA自带的断点调试工具,可以控制代码从断点开始一行一行的执行,然后详细看程序执行情况
Debug工具基本使用步骤: