以下学习笔记记录于:2024.07.17-2024.07.23
文章目录
阶段一 JavaSE基础
第一章 Java基本语法
1-5 数组
08 数组在计算机中的执行原理,Java内存分配
09 多个变量指向同一个数组
10 数组案例:求最值
// 求取数组中的最大值
public class ArrayMax {
public static void main(String[] args) {
// 1.把颜值数据存在数组中
int[] faceScores = {15, 900, 100, 888, 66, -5};
// 2.定义一个变量来记住当前最大值
int max = faceScores[0]; // 建议使用数组第一个值当作参考值
// 3.从数组第二个位置开始遍历
for (int i = 1; i < faceScores.length; i++) {
// 将当前遍历到的数据与参考值进行比较
if (faceScores[i] > max){
max = faceScores[i];
}
}
System.out.println("最高颜值为:" + max);
}
}
11 数组案例:数组反转
// 完成数组反转
public class ArrayInversion {
public static void main(String[] args) {
int[] arr = {10, 20, 30, 40, 50, 60};
// 定义一个循环,设计2个变量,一个在前,一个在后
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
int temp = 0;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
运行结果:
12 数组案例:随机排名
import java.util.Random;
import java.util.Scanner;
// 随机排名
public class ArrayRandom {
public static void main(String[] args) {
// 1.定义一个动态初始化数组来存储5名员工的工号
int[] numbers = new int[5];
// 2.提示用户录入对应5名员工的工号
Scanner sc = new Scanner(System.in);
for (int i = 0; i < numbers.length; i++) {
System.out.println("请输入第" + (i+1) + "位员工的工号:");
numbers[i] = sc.nextInt();
}
// 3.打乱数组中的元素顺序
// 每遍历到一个数据,都随机生成一个数组索引范围内的值,然后将当前遍历到的数据与该索引对应位置处的值进行互换
Random r = new Random();
for (int i = 0; i < numbers.length; i++) {
int index = r.nextInt(5);
int temp = numbers[i];
numbers[i] = numbers[index];
numbers[index] = temp;
}
// 4.输出已打乱的工号
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i] + " ");
}
}
}
运行结果:
1-6 方法
01 方法概述
注:
-
方法修饰符此处暂时都使用 public static 修饰;
-
在形参列表中不能给初始化值。
03 方法使用时的常见问题
- 一个方法不能定义在另一个方法里面;
- void:无返回申明,不需要return返回数据;
- return语句下面不能编写代码,若有则为无效代码,执行不到return后面去(报错内容:Unreachable statement);
- 调用无返回值的方法只有1种方式:直接调用。
public class MethodProblem {
public static void printHelloWorld(){
for (int i = 0; i < 3; i++) {
System.out.println("Hello World!");
}
}
public static int sum(int a, int b){
return a + b;
}
public static void main(String[] args) {
// 调用有返回值的方式有以下3种
// 1.定义变量来接收结果
int r = sum(10, 9);
System.out.println(r);
// 2.直接输出调用
System.out.println(sum(3, 3));
// 3.直接调用
sum(3, 4);
// 调用无返回值的方法只有1种方式:直接调用
printHelloWorld();
}
}
运行结果:
06 Java的参数传递机制:基本类型的参数传递(值传递)
// 理解方法的参数传递机制:值传递
public class MethodDemo {
public static void main(String[] args) {
int a = 10;
change(a); // 相当于change(10);
System.out.println("main:" + a);
}
public static void change(int a){
System.out.println("change1:" + a);
a = 20;
System.out.println("change2:" + a);
}
}
运行结果:
07 Java的参数传递机制:引用类型的参数传递(值传递)
// 理解方法的参数传递机制:值传递
public class MethodDemo1 {
public static void main(String[] args) {
int[] arrs = new int[]{10, 20, 30};
change(arrs); // change(arrs中存储的地址)
System.out.println("main:" + arrs[1]);
}
public static void change(int[] arrs){ // 同样也是值传递,传入的是实参变量中存储的值的副本(也就是地址),而同一地址所指向的是同一个位置
System.out.println("方法内1:" + arrs[1]);
arrs[1] = 100; // 修改arrs所指地址中第2个位置的值
System.out.println("方法内2:" + arrs[1]);
}
}
执行原理:
运行结果:
基本类型和引用类型在参数传递方面:
08 参数传递的案例1:打印数组内容
// 打印数组内容
public class ArrayPrintDemo {
public static void main(String[] args) {
int[] arrs = {10, 20, 30};
printArray(arrs);
int[] arrs1 = null;
printArray(arrs1);
int[] arrs2 = {};
printArray(arrs2);
}
public static void printArray(int[] arrs){
// 防止传入数组为空
if(arrs == null){
System.out.println(arrs);
return; // 立即跳出并结束当前方法的执行
}
System.out.print("[");
for (int i = 0; i < arrs.length; i++) {
// if (i == arrs.length - 1){
// System.out.print(arrs[i]);
// }else {
// System.out.print(arrs[i] + ", ");
// }
System.out.print(i == arrs.length - 1 ? arrs[i] : arrs[i] + ", "); // 优化写法
}
System.out.println("]");
}
}
运行结果:
09 参数传递的案例2:判断两个数组是否相同
// 判断两个数组是否相同
public class ArrayEqual {
public static void main(String[] args) {
int[] arrs1 = {10, 20, 30, 40};
int[] arrs2 = {10, 20, 30};
System.out.println(Equals(arrs1, arrs2));
}
public static boolean Equals(int[] arrs1, int[] arrs2){
// 要预测一些非法状况
// 两者均为null则相同
if (arrs1 == null && arrs2 == null){
return true;
}
// 其中一者为空,另一个非空则不相等
if (arrs1 == null || arrs2 == null){
return false;
}
// 两者长度不同也不想等
if (arrs1.length != arrs2.length){
return false;
}
//两者长度一样则进行值对比
for (int i = 0; i < arrs1.length; i++) {
if (arrs1[i] != arrs2[i]){
return false;
}
}
return true;
}
}
10 方法重载
1-7 案例
02 买飞机票
// 目标:完成买飞机票的案例
public class planeTicketDemo {
public static void main(String[] args) {
double price = calculate(1000, 8, "经济舱");
System.out.printf("优惠价为:%.2f元%n", price);
}
// 计算飞机票价格的方法
// 此处month和type不用担心有特殊情况,之后的业务场景中在设计页面时会控制用户的输入范围
public static double calculate(double price, int month, String type){
// 1.判断当前月份的情况
if (month >= 5 && month <= 10){
// 旺季
// 2.判断仓位类型
switch (type){
case "头等舱":
price *= 0.9;
break;
case "经济舱":
price *= 0.85;
break;
}
}else {
// 淡季
switch (type){
case "头等舱":
price *= 0.7;
break;
case "经济舱":
price *= 0.65;
break;
}
}
return price;
}
}
运行结果:
总结:
03 生成随机验证码
import java.util.Random;
// 目标:生成随机验证码
public class captchaDemo {
public static void main(String[] args) {
System.out.println("生成的随机验证码为:" + createCode(5));
}
public static String createCode(int n){
Random r =new Random();
// 3.定义一个String变量来连接产生的每位随机字符
String code = "";
// 1.定义一个for循环用于控制产生多少位的随机字符
for (int i = 1; i <= n; i++) {
// 2.每个位置均可能是数字、大写字母、小写字母之一,用0、1、2来分别代表不同的字符
int type = r.nextInt(3); // 通过type来确定该位置上是什么字符
switch (type){
case 0: // 0代表生成数字字符0~9
code += r.nextInt(10);
break;
case 1: // 1代表是大写字母(其中ASCII码分别为A:65,Z:65+25 ➡ (0-25) + 65),需要转换成char类型才是字母形式呈现
char ch = (char)(r.nextInt(26) + 65);
code += ch;
break;
case 2: // 2代表是小写字母(其中ASCII码分别为a:95,z:95+25 ➡ (0-25) + 95),需要转换成char类型才是字母形式呈现
char ch1 = (char)(r.nextInt(26) + 95);
code += ch1;
break;
}
}
return code;
}
}
运行结果:
04 评委打分
import java.util.Scanner;
// 目标:评委打分
public class averageScoreDemo {
public static void main(String[] args) {
System.out.println("最终得分为:" + getAverageScore(6));
}
public static double getAverageScore(int n){ // 传入评委位数
// 1.定义一个动态初始化数组来存储评委打分情况
int[] scores = new int[n]; // scores = [0, 0, 0, 0, ……]
// 2.输入评委所给分数
Scanner sc= new Scanner(System.in);
for (int i = 0; i < scores.length; i++) {
// 评委打分范围为[0, 100]
System.out.println("请输入第" + (i+1) + "位评委的打分情况:");
scores[i] = sc.nextInt();
}
// 3.找出最高分、最低分,以及计算出总分
int sum = 0;
int max = scores[0]; //max、min均以数组第一位作为参考
int min = scores[0];
for (int i = 0; i < scores.length; i++) {
sum += scores[i];
if (max < scores[i]){
max = scores[i];
}
if (min > scores[i]){
min = scores[i];
}
}
return 1.0 * (sum - max - min) / (n - 2); // 评委所给为int,但平均分要保留小数,所以*1.0
}
}
运行结果:
05 数组加密
import java.util.Scanner;
// 目标:数组加密
public class arrayEncryptionDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入4位数的密码:");
int password = sc.nextInt();
System.out.println("加密后的密码为:" + encrypt(password));
}
// 将加密后的数据再传入一次便是解密
public static String encrypt(int password) {
// 1.将传入的密码拆分为一位一位的数字存储在数组中
int[] passwords = split(password); // 拆分为 passwords = [?, ?, ?, ?]
// 2.对每位数字进行对应的加密处理
for (int i = 0; i < passwords.length; i++) {
passwords[i] = (passwords[i] + 5) % 10;
}
// 3.对数组进行反转操作
reverse(passwords);
// 4.对最终结果进行输出返回
String data = "";
for (int i = 0; i < passwords.length; i++) {
data += passwords[i];
}
return data;
}
// 数组反转,此处选择方式2(方式1:从后往前遍历数组即可;方式2:将数组前后位置数据进行对调,然后顺序遍历数组)
public static void reverse(int[] passwords) {
for (int i = 0, j = passwords.length - 1; i < j; i++, j--) {
int temp = passwords[j];
passwords[j] = passwords[i];
passwords[i] = temp;
}
}
// 拆分密码
public static int[] split(int password) {
int[] passwords = new int[4];
passwords[0] = password / 1000;
passwords[1] = (password / 100) % 10;
passwords[2] = (password / 10) % 10;
passwords[3] = password % 10;
return passwords;
}
}
运行结果:
07 抢红包
import java.util.Random;
import java.util.Scanner;
// 目标:抢红包
// 方案1:将抽中的红包金额置为0
public class grabRedEnvelopeDemo {
public static void main(String[] args) {
int[] money = {9, 666, 188, 520, 99999};
Scanner sc = new Scanner(System.in);
Random r =new Random();
for (int i = 0; i < money.length; i++) {
System.out.println("请输入任意内容进行抽奖:");
sc.next(); // 等待用户输入内容并按下回车继续执行
// 设置一个死循环来随机抽取不同的红包金额
while (true) {
int index = r.nextInt(money.length); // 生成0-4的随机索引值来抽取不同红包金额
// 判断红包金额是否为0,若为0则继续抽取红包金额非零
if (money[index] != 0){
System.out.println("恭喜您抽中了红包:" + money[index]);
money[index] = 0;
break;
}
}
}
System.out.println("活动结束!");
}
}
// 方案2:将数组内容随机打乱,然后顺序输出
//public class grabRedEnvelopeDemo {
// public static void main(String[] args) {
// int[] money = {9, 666, 188, 520, 99999};
// Scanner sc = new Scanner(System.in);
// Random r =new Random();
// for (int i = 0; i < money.length; i++) {
// int index = r.nextInt(5);
// int temp = money[i];
// money[i] = money[index];
// money[index] = temp;
// }
// // 顺序抽取已打乱的红包
// for (int i = 0; i < money.length; i++) {
// System.out.println("请输入任意内容进行抽奖:");
// sc.next(); // 等待用户输入内容并按下回车继续执行
// System.out.println("恭喜您抽中了红包:" + money[i]);
// }
// System.out.println("活动结束!");
// }
//}
运行结果:
方案1需要判断是否金额为0,若多次随机抽取到的位置金额均为0,则在查找非零红包上会花费一些时间。所以,在性能方面方案2会好一些。
08 找素数
public class findPrimeNumberDemo {
public static void main(String[] args) {
System.out.printf("%n当前区间素数个数为:%d", search(101, 200));
}
// 返回素数数量,输出素数
public static int search(int start, int end) {
int count = 0;
for (int i = start; i <= end ; i++) {
// 定义一个信号标志位(信号位思想)
boolean flag = true; //默认为素数
// 判断2到该数一半的数据中是否有可以整除它的数,若存在则非素数
for (int j = 2; j <= i / 2; j++) {
if (i % j ==0){
flag = false;
break; //不是素数
}
}
if (flag){ // 是素数
count++;
if (count % 10 == 0){ // 每10个为一行
System.out.println(i);
}else {
System.out.print(i + " ");
}
}
}
return count;
}
}
运行结果:
09 双色球
import java.util.Random;
import java.util.Scanner;
// 目标:完成双色球系统
public class unionLottoDemo {
public static void main(String[] args) {
int[] userNumbers = userSelectNumbers(); // 将用户所投注的号码存储成数组
System.out.println("投注的号码是");
printArray(userNumbers); // 输出用户投注的号码组
int[] luckNumbers = createNumbers(); // 将随机生成的中奖号码存储入数组
System.out.println("中奖的号码是");
printArray(luckNumbers); // 输出中奖号码组
judge(userNumbers, luckNumbers); // 判断中奖情况
}
// userSelectNumbers方法用于记录用户投注的号码并进行返回
public static int[] userSelectNumbers(){
// 创建一个数组存储用户投注的 6+1 个号码(6红,1蓝)
int[] numbers = new int[7]; // numbers = [0, 0, 0, 0, 0, 0, 0];
Scanner sc =new Scanner(System.in);
// 用户先输入所要投注的6个红球号码(1-33之间,球号不能重复)
for (int i = 0; i < numbers.length - 1; i++) {
// 直到用户输入正确的号码组后退出死循环
while (true) {
System.out.println("请输入第" + (i+1) + "个红球号码(1-33之间,球号不能重复):");
int number = sc.nextInt();
// 判断用户所投注的号码是否合理(1-33之间,球号不能重复)
if (number < 1 || number > 33){
System.out.println("对不起,您输入的红球号码不在规则内,请确认号码是否在1-33之间!");
}else {
// 判断号码是否输入重复,若不重复才可以正式存入数组中
if (exist(numbers, number)){
System.out.println("您输入的号码有重复,请重新输入新的号码!");
}else{
numbers[i] = number;
break;
}
}
}
}
// 用户投注篮球号码
while (true) {
System.out.println("请输入1个蓝球号码(1-16之间):");
int number = sc.nextInt();
// 判断用户所投注的号码是否合理(1-33之间,球号不能重复)
if (number < 1 || number > 16){
System.out.println("对不起,您输入的蓝球号码不在规则内,请确认号码是否在1-16之间!");
}else {
numbers[6] = number;
break;
}
}
return numbers;
}
// 判断用户输入的号码是否重复,重复返回true,反之为false
private static boolean exist(int[] numbers, int number) {
for (int i = 0; i < numbers.length; i++) {
// 若遍历到数组为0处,则说明后面还没有存入用户输入的数据,不必继续往后查看是否有重复号码
if (numbers[i] == 0){
break;
}
if (numbers[i] == number){
return true;
}
}
return false;
}
// printArray方法用于输出用户投注的号码组
private static void printArray(int[] arrs) {
System.out.print("[");
for (int i = 0; i < arrs.length; i++) {
System.out.print(i == arrs.length - 1 ? arrs[i] : arrs[i] + ", "); // 优化写法
}
System.out.println("]");
}
// createNumbers方法用于生成一组中奖号码并进行输出(6红,1蓝)
public static int[] createNumbers(){
int[] numbers = new int[7];
Random r = new Random();
// 生成红球中奖号码,1-33
for (int i = 0; i < numbers.length - 1; i++) {
while (true) {
int number = r.nextInt(33) + 1; // 生成1-33的红球中奖号码
// 判断随机生成的红球号码是否合理(1-33之间,球号不能重复)
if (!exist(numbers, number)){ //号码不重复才会进来
numbers[i] = number;
break;
}
}
}
// 生成蓝球中奖号码,1-16
numbers[6] = r.nextInt(16) + 1;
return numbers;
}
// judge方法用来判断用户的中奖情况并进行输出
public static void judge(int[] userNumbers, int[] luckNumbers){ // 数组前6个为红球号码,最后一个为蓝球号码
// 定义两个变量来记录用户的中奖号码个数
int redCount = 0;
int blueCount = 0;
// 判断红球命中数量,数组前6个
for (int i = 0; i < userNumbers.length - 1; i++) {
for (int j = 0; j < luckNumbers.length - 1; j++) {
if (userNumbers[i] == luckNumbers[j]){
redCount++;
break; // 因为中奖号码每个不重复,所以一旦匹配到则退出内部循环
}
}
}
// 判断蓝球是否命中
blueCount = userNumbers[6] == luckNumbers[6] ? 1 : 0;
System.out.println("您命中的红球数量是:" + redCount);
System.out.println("您命中的蓝球数量是:" + blueCount);
// 判断中奖金额
if (redCount == 6 && blueCount == 1){
System.out.println("恭喜中奖1000万,今天实现了十分之一的小小目标!!!😊");
}else if (redCount == 6 && blueCount == 0){
System.out.println("恭喜中奖500万,可以开始稍微享受人生喽!!!o(* ̄▽ ̄*)ブ");
}else if (redCount == 5 && blueCount == 1){
System.out.println("恭喜中奖3000元,可以出去吃顿好的哈哈哈!");
}else if (redCount == 5 && blueCount == 0 || redCount == 4 && blueCount == 1){
System.out.println("200元到手,可以少加班一会");
}else if (redCount == 4 && blueCount == 0 || redCount == 3 && blueCount == 1){
System.out.println("中了10元,来自一杯蜜雪冰城的爱~~~");
}else if (redCount < 3 && blueCount == 1){
System.out.println("中了5元,天气热可以买支雪糕吃,雪糕也是爱~");
}else {
System.out.println("感谢您对福利事业做出的巨大贡献/(ㄒoㄒ)/~~");
}
}
}
运行结果: