黑马java学习笔记3(阶段一 第一章1-5 08~1-7)第一章完结

以下学习笔记记录于:2024.07.17-2024.07.23

阶段一 JavaSE基础

第一章 Java基本语法

1-5 数组

08 数组在计算机中的执行原理,Java内存分配

image-20240717114510302
在这里插入图片描述

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 方法概述

在这里插入图片描述

image-20240718162929448

注:

  • 方法修饰符此处暂时都使用 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();
    }
}

运行结果:
image-20240718162332063

06 Java的参数传递机制:基本类型的参数传递(值传递)

image-20240718163903730

// 理解方法的参数传递机制:值传递
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);
    }
}

运行结果:
image-20240718164221786

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]);
    }
}

执行原理:
image-20240718164711557

运行结果:
image-20240718165655686

基本类型和引用类型在参数传递方面:
image-20240718165315564

08 参数传递的案例1:打印数组内容

image-20240718170400840

// 打印数组内容
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("]");
    }
}

运行结果:
image-20240718171638764

09 参数传递的案例2:判断两个数组是否相同

image-20240718195105301

// 判断两个数组是否相同
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 方法重载

image-20240718200000423

1-7 案例

02 买飞机票

image-20240718204339798

// 目标:完成买飞机票的案例
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;
    }
}

运行结果:
image-20240718204241697

总结:
image-20240718204157232

03 生成随机验证码

image-20240718204533405

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;
    }
}

运行结果:
image-20240718211042739

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 数组加密

image-20240719111441278

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;
    }
}

运行结果:
image-20240719111215679

07 抢红包

image-20240719185050850

image-20240719184955931

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("活动结束!");
//    }
//}

运行结果:
image-20240721161712553

image-20240719185208973

方案1需要判断是否金额为0,若多次随机抽取到的位置金额均为0,则在查找非零红包上会花费一些时间。所以,在性能方面方案2会好一些。

08 找素数

image-20240721170821019

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;
    }
}

运行结果:
image-20240721170638755

09 双色球

image-20240722161350594

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ㄒ)/~~");
        }
    }
}

运行结果:
image-20240722194621784

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值