目录
①创建二维数组格式一:动态初始化——创建数组对象时就指定了两个维度的数组长度
②创建二维数组格式二:动态初始化——仅指定第一个维度的数组长度
④创建二维数组格式四:声明变量时,两层[]没在一起,不建议使用
一、循环控制语句
for、while、do…while均可以作为外循环
1.特殊关键字
①break:只能用于switch语句和循环语句中
结束本层循环
例:
public class Break{
public static void main(String[] args){
for(int k = 0;k <=9;k ++){
for(int i = 0;i <= 9;i ++){
if(i == 6){
break;
}
System.out.print("k=" + k + "i=" + i);
}
System.out.println("k=" + k);
}
}
}
结束for(int i = 0;i<=9;i ++)的循环,for(int k = 0;k <=9;k ++)正常进行
通过标号来结束外层循环(不推荐使用,可读性差)
public class Break{
public static void main(String[] args){
a:for(int k = 0;k <=9;k ++){
b:for(int i = 0;i <= 9;i ++){
if(i == 6){
break;
}
if(k == 6){
break a;
}
System.out.print("k=" + k + "i=" + i);
}
System.out.println("k=" + k);
}
}
}
②continue:只能用于循环语句中
提前结束本次循环,进入下一次循环
例
public class Continue{
public static void main(String[] args){
for(int i = 0;i <= 9;i ++){
System.out.println(i);
System.out.println("**");
if(i == 6){
//提前结束本次循环,进入下一次循环
continue;
}
System.out.println("***");
}
}
}
通过标号来结束外层循环(不推荐使用,可读性差)
public class Continue{
public static void main(String[] args){
a:for(int i = 0;i <= 9;i ++){
b:for(int j = 0;j <= 9;j ++){
if(i == 6){
continue a;
}
System.out.println(i + "," + j);
}
}
}
}
③return:结束一个方法
直接结束整个方法,不论return处于多少层循环之中
本质上不是控制循环的语句,,是用来结束一个函数(方法)的,当函数结束时,循环也随之结束
2.练习
①输出一百以内素数
public class SuShu{
public static void main(String[] args){
//外层循环,列出2~100所有数字
for(int i = 2;i <= 100;i ++){
//声明一个变量,用来保存当前数字是否为素数
//默认为true
boolean primeFlag = true;
//内层循环验证i变量中保存的这个数是不是素数
//验证方式:对i从【2到i/2】的所有数取模
//如果能够整除,那么这个数不是素数
for(int j = 2;j <= i/2;j ++){
if(i % j == 0){
//i能被整除,不是素数。将PrimeFlag设为false
primeFlag = false;
//i只要能被任何一个j整除,则i就不是素数,所以后边就不用再试
break;
}
}
if(primeFlag){
System.out.println("i=" + i);
}
}
}
}
3.家庭收支记账
①介绍Utility工具类
这个类使用时,和主体程序目录放在一起即可
调用方式 | 方法作用 |
---|---|
Utility.readMenuSelection() | 读取菜单序号:1、2、3、4 |
Untility.readNumber() | 读取金额数值 |
Utility.readString() | 读取文字 |
Utility.readConfirmSelection() | 读取确认是否退出Y/N |
Utility.readKeyBoard(int limit) | 从键盘读取limit个字符 |
Utility工具类和FamilyAccount类要放在一起
②创建主体类程序
public class FamilyAccount{
public static void main(String[] args){
}
}
③完整代码
public class FamilyAccount{
public static void main(String[] args){
//初始化:用户记账金额初始值设为10000元
int balance = 10000;
//初始化:显示收支明细时使用表头信息
String table = "收支\t账户金额\t收支金额\t说 明\n";
//使操作循换
//使用Ctrl+c强制结束进程
while(true){
//界面:标题
System.out.println("------------家庭收支记账软件------------");
//界面:菜单选项
System.out.println("1 收支明细");
System.out.println("2 登记收入");
System.out.println("3 登记支出");
System.out.println("4 退\t出");
//界面:提示用户输入菜单项的序号
System.out.print("请输入菜单项的序号(1-4):");
//读取:用户输入的菜单项序号
char menuSelection = Utility.readMenuSelection();
System.out.println(menuSelection);
//分支结构:根据用户输入的数字,执行对应操作
switch(menuSelection){
case '1':
System.out.println(table);
break;
case '2':
//界面:提示用户输入收入金额
System.out.println("请输入收入金额:");
int income = Utility.readNumber();
//界面:提示用户输入收入说明
System.out.println("请输入收入说明");
String incomeDescription = Utility.readString();
//系统内部运算:将收入金额累加到总余额中
balance = balance + income;
//系统内部运算:将新的收入明细信息附加到表格中
table = table + "收入\t" + balance + "\t\t" + income + "\t\t" + incomeDescription + "\n";
//提示已保存
System.out.println(incomeDescription + "已保存收入登记信息");
break;
case '3':
//界面:提示用户输入支出金额
System.out.println("请输入支出金额:");
int outcome = Utility.readNumber();
//界面:提示用户输入支出说明
System.out.println("请输入支出说明");
String outcomeDescription = Utility.readString();
//系统内部运算:将收入金额累减到总余额中
balance = balance - outcome;
//系统内部运算:将新的支出明细信息附加到表格中
table = table + "支出\t" + balance + "\t\t" + outcome + "\t\t" + outcomeDescription + "\n";
//提示已保存
System.out.println(outcomeDescription + "已保存收入登记信息");
break;
case '4':
System.out.print("确认是否退出Y|N:");
char confirmWord = Utility.readConfirmSelection();
if(confirmWord == 'Y'){
return;
}
break;
}
}
}
}
二、idea的使用
1.概念
project:工程
module:模块
模块包含在工程中
2.编写
创建工程→创建module→创建类
①创建类
最好把类都放在包中
取名格式:
公司或组织域名的倒序.项目名称.模块名称.具体包名.类名
com.atguigu.mall.product.service.ProductService
例:com.atguigu.iavase.idea.HotKeyTest
三、数组
1、概念
一组相同类型数据的容器
相同类型:Java语言要求存入数组的数据类型必须一致
容器:用来存放数据
一组容器中可以存放多个数据
长度一旦确定不能再修改
2.创建数组
①声明数组变量
int[] ageArray;
String[] nameArray;
double salaryArray [];
[]也可以放在变量名的后面,但是建议放在类型的后面
[]中不能指定数组长度
②.创建数组对象
①动态
ageArray = new int[5];
②静态
[]中不能规定长度
nameArray = new String[]{"foo","bar","biz"};
③将数据存入数组
ageArray[0] = 10;
ageArray[1] = 11;
ageArray[2] = 12;
ageArray[3] = 13;
ageArray[4] = 14;
nameArray[0] = "aaa";
nameArray[1] = "bbb";
nameArray[2] = "ccc";
④从数组中读取数据
利用System.out.println();
⑤遍历数组
Array.length是数组的长度
for(int i = 0;i <= Array.length;i ++){
int age = ageArray[i];
System.out.println("age" = age);
}
⑥数组必须创建对象再访问元素
⑦数组中元素默认值
数组元素类型 | 元素初始默认值 |
---|---|
byte | |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 |
char | 0或:'\u0000'(表现为空) |
boolean | false |
引用数据类型 | null |
3.内存分析
①基本数据类型保存在栈内存中
int a = 10;
②引用数据保存在堆内存中,形式为地址
创建对象
Scanner scanner = new Scanner(System.in);
创建数组对象
int[] ageArray;
ageArray = new int[5];
将数据写入数组
ageArray[0] = 8;
多声明一个数组变量
int[] otherArray = ageArray;
通过另一个变量访问数组元素
数组变量指向新数组对象
otherArray = new int[2];
给新数组元素赋值
otherArray[1] = 33;
4.练习
分析以下需求,并用代码实现:
(1)在编程竞赛中,有10位评委为参赛的选手打分,分数分别为:5,4,6,8,9,0,1,2,7,3
(2)求选手的最后得分(去掉一个最高分和一个最低分后其余8位评委打分的平均值)
int[] scoreArray = {5,4,6,8,9,0,1,2,7,3};
// 声明两个变量,用于保存打分数据中的最大值和最小值
// maxScore和minScore的初始值应该是数组中的某一个元素
// 以minScore为例,如果初始值为0,原始数组中所有数值都比0大,则无法正确找到真正的最小值
int maxScore = scoreArray[0];
int minScore = scoreArray[0];
// 遍历数组,获取每一个具体的分数
for (int i = 0; i < scoreArray.length; i++) {
// 获取每一个数组元素
int score = scoreArray[i];
// 拿当前遍历得到的元素和maxScore进行比较
if (score > maxScore) {
// 如果当前元素大于maxScore,则将当前元素赋值给maxScore
maxScore = score;
}
// 拿当前遍历得到的元素和minScore进行比较
if (score < minScore) {
// 如果当前元素小于minScore,则将当前元素赋值给minScore
minScore = score;
}
}
System.out.println("minScore = " + minScore);
System.out.println("maxScore = " + maxScore);
// 声明变量用来保存累加的结果
int sum = 0;
// 为了求平均值,需要再遍历一次
for (int i = 0; i < scoreArray.length; i++) {
int score = scoreArray[i];
sum = sum + score;
}
// 根据评分规则,最高分和最低分分别只去掉一个,所以在上面全部分数累加结果中把最高分和最低分减去即可
// 累加结果除以8得到平均值
double average = (sum - maxScore - minScore) / 8.0;
System.out.println("average = " + average);
从键盘读入学生成绩,找出最高分,并输出学生成绩等级。 成绩>=最高分-10 等级为’A’
成绩>=最高分-20 等级为’B’ 成绩>=最高分-30 等级为’C’
其余 等级为’D’
// 1.创建Scanner对象
Scanner scanner = new Scanner(System.in);
// 2.读取用户输入的学生人数
System.out.print("请输入学生人数:");
int studentCount = scanner.nextInt();
// 3.根据用户输入的学生人数创建数组对象(以学生人数作为数组长度)
int[] scoreArray = new int[studentCount];
// 4.将用户输入的学生成绩保存到数组中
for (int i = 0; i < studentCount; i++) {
// 5.读取用户输入
System.out.print("请输入第" + (i + 1) + "位学生成绩:");
int score = scanner.nextInt();
// 6.将学生成绩存入数组下标对应的位置
scoreArray[i] = score;
}
// 二、查找已输入数据中的最大值
// 1.声明一个变量用来存储最大值
// 为什么最大值变量的初始值设置为scoreArray[0]?
// 假设成绩是:-10,-20,-30
// 假设maxScore是:0
// 最大值是:0
int maxScore = scoreArray[0];
// 2.遍历成绩数组
for (int i = 0; i < scoreArray.length; i++) {
// 3.获取当前成绩数据
int score = scoreArray[i];
// 4.检查当前成绩是否大于maxScore
if (score > maxScore) {
// 5.如果当前成绩大于maxScore,就把maxScore设置为当前成绩
maxScore = score;
}
}
System.out.println("maxScore = " + maxScore);
// 三、按照等级打印学生成绩
// 1.遍历学生成绩数组
for (int i = 0; i < scoreArray.length; i++) {
// 2.获取当前成绩数据
int score = scoreArray[i];
// 3.逐级判断当前成绩数据属于哪个等级
if (score > maxScore - 10) {
System.out.println("第" + (i+1) + "位学生的成绩" + score + "是A级");
} else if (score > maxScore - 20) {
System.out.println("第" + (i+1) + "位学生的成绩" + score + "是B级");
} else if (score > maxScore - 30) {
System.out.println("第" + (i+1) + "位学生的成绩" + score + "是C级");
} else {
System.out.println("第" + (i+1) + "位学生的成绩" + score + "是D级");
}
}
四、多维数组
1.概念
一维数组:线
二维数组:面
三维数组:立体空间
2.多维数组底层内存结构
int[][] = new numberArr[3][2];
numberArr[0] = new int[2];
numberArr[0][0] = 5;
numberArr[0]指向另一个数组
3.语法层面
①创建二维数组格式一:动态初始化——创建数组对象时就指定了两个维度的数组长度
int[][] arr2d01 = new int[3][2];
arr2d01[0][0] = 100;
arr2d01[0][1] = 101;
arr2d01[1][0] = 102;
arr2d01[1][1] = 103;
arr2d01[2][0] = 104;
arr2d01[2][1] = 105;
②创建二维数组格式二:动态初始化——仅指定第一个维度的数组长度
Java中多维数组不必都是规则矩阵形式
int[][] arr2d02 = new int[3][];
arr2d02[0] = new int[]{3, 5, 7};
arr2d02[1] = new int[]{14, 21, 66, 89};
arr2d02[2] = new int[]{90, 100};
③创建二维数组格式三:静态初始化——在创建对象时将数据填充
如果某个元素位置设置为null不会编译报错,但是访问这个位置时还是要先初始化
前面设置null的地方,需要初始化才可以访问:arr2d03[2] = new int[]{12,24};
int[][] arr2d03 = new int[][]{{1,2,3}, {4,5}, null, {6,7,8}};
arr2d03[2] = new int[]{12,24};
arr2d03[2][0] = 5;
④创建二维数组格式四:声明变量时,两层[]没在一起,不建议使用
int[] x[] = new int[][]{{1,2,3}, {4,5}, {6,7,8}};
4.访问二维数组元素
int[][] arr2d05 = new int[2][2];
arr2d05[1][0] = 10;
System.out.println("arr2d05[1][0] = " + arr2d05[1][0]);
5.遍历二维数组元素
int[][] arr2d06 = new int[][]{{0,1,2},{3,4,5},{6,7},{8}};
for (int i = 0; i < arr2d06.length; i++) {
int[] intArr = arr2d06[i];
for (int j = 0; j < intArr.length; j++) {
int intValue = intArr[j];
System.out.println("intValue[" + i +"][" + j + "] = " + intValue);
}
}
6.练习
//1、创建二维数组
int[][] yanghuiArr = new int[10][];
// 2.通过双层for循环给二维数组填充数据
for (int i = 0; i < yanghuiArr.length; i++) {
// 3.创建一维数组,对yanghuiArr下标i位置进行初始化
yanghuiArr[i] = new int[ i + 1 ];
// 4.遍历一维数组,填充数据
for (int j = 0; j <= i; j++) {
// 5.一头(一维数组的下标0元素)一尾(一维数组的下标长度-1元素)固定就是1
// 一维数组中最后一个元素的下标正好就是现在外层循环变量:i
if (j == 0 || j == i) {
yanghuiArr[i][j] = 1;
} else {
// 6.非头尾的元素,由上一行中两个元素相加得到
// 第一个值的下标:[i-1][j-1]
// 第二个值的下标:[i-1][j]
yanghuiArr[i][j] = yanghuiArr[i-1][j-1] + yanghuiArr[i-1][j];
}
}
}
// 7.遍历填充数据的二维数组
for (int i = 0; i < yanghuiArr.length; i++) {
int[] yanghuiValueArr = yanghuiArr[i];
for (int j = 0; j < yanghuiValueArr.length; j++) {
System.out.print(yanghuiValueArr[j] + "\t");
}
System.out.println();
}