Java初接触 | 数组【案例、内存图、常见问题、Debug工具的使用】

140 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12月更文挑战」的第12天

数组【案例】

案例1:数组遍历-求和

image.png

// 需求:数组元素求和
// 1、把这些数据拿到程序中使用数组记住
int[] money = {16, 26, 36, 6, 100};

// 3、定义一个求和变量累加数组的元素值
int sum = 0;

// 2、遍历数组中的每个元素
for (int i = 0; i < money.length; i++) {
    // 拿到每个元素值累加
    sum += money[i];
}

// 4、输出求和变量即可
System.out.println("数组的元素和是:" + sum);

案例2:数组求最值

image.png

// 需求:数组元素求最值。

// 1、定义一个静态初始化的数组,存储一批颜值。
int[] faceScore = {15, 9000, 10000, 20000, 9500, -5};
//                 0    1      2     3      4    5

// 2、定义一个变量用于存储最大值元素,建议使用第一个元素作为参照。
int max = faceScore[0];

// 3、遍历数组的每个元素,依次与最大值变量的数据比较,若较大,则替换。
for (int i = 1; i < faceScore.length; i++) {
    if(faceScore[i] > max){
        max = faceScore[i];
    }
}

// 4、输出最大值变量存储的数据即可。
System.out.println("数组的最大值是:" + max);

案例3:猜数字游戏

image.png

// 需求:5个 1-20之间的随机数,让用户猜测,猜中要提示猜中,还要输出该数据在数组中第一次出现的索引,并打印数组的内容出来。
// 没有猜中继续。

// 1、定义一个动态初始化的数组存储5个随机的1-20之间的数据
int[] data = new int[5];

// 2、动态的生成5个1-20之间的随机数并存入到数组中去。
Random r = new Random();
for (int i = 0; i < data.length; i++) {
    // i = 0 1 2 3 4
    data[i] = r.nextInt(20) + 1;
}

// 3、使用一个死循环让用户进行猜测
Scanner sc = new Scanner(System.in);
OUT:
while (true) {
    System.out.println("请您输入一个1-20之间的整数进行猜测:");
    int guessData = sc.nextInt();

    // 4、遍历数组中的每个数据,看是否有数据与猜测的数据相同,相同代表猜中了,给出提示
    for (int i = 0; i < data.length; i++) {
        if(data[i] == guessData){
            System.out.println("您已经猜中了该数据,运气不错了!您猜中的数据索引是:" + i);
            break OUT; // 结束了整个死循环,代表游戏结束了!
        }
    }
    System.out.println("当前猜测的数据在数组中不存在,请重新猜测!");
}

// 5、输出数组的全部元素,让用户看到自己确实是猜中了某个数据。
for (int i = 0; i < data.length; i++) {
    System.out.print(data[i] + "\t");
}

案例4:随机排名

image.png

// 目标:键盘录入一组工号,最终要随机输出一组出来作为排名
// 1、动态初始化一个数组,存储5个工号
int[] codes = new int[5];

// 2、定义一个循环,循环5次,依次录入一个工号存入对应的位置
Scanner sc = new Scanner(System.in);
for (int i = 0; i < codes.length; i++) {
    // 正式录入工号
    System.out.println("请您输入第" + (i + 1) + "个员工的工号:");
    int code = sc.nextInt();
    // 存入到数组中去
    codes[i] = code;
}

// 3、遍历数组中的每个元素,然后随机一个索引出来,让该元素与随机索引位置处的元素值进行交换(本节的重点)
// codes = [12, 36, 28, 45, 99]
Random r = new Random();
for (int i = 0; i < codes.length; i++) {
    // 当前遍历的元素值:codes[i]
    // 随机一个索引位置出来:codes[index]
    int index = r.nextInt(codes.length);

    // 定义一个临时变量存储index位置处的值
    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] + "\t");
}

案例5:数组排序

冒泡排序

// 1、定义一个数组,存储一些数据啊
int[] arr = {5, 2, 3, 1};
//           0  1  2  3

// 2、定义一个循环控制比较的轮数
for (int i = 0; i < arr.length - 1; i++) {
    // i == 0  比较的次数 3  j = 0 1 2
    // i == 1  比较的次数 2  j = 0 1
    // i == 2  比较的次数 1  j = 0
    // 3、定义一个循环控制每轮比较的次数,占位
    for (int j = 0; j < arr.length - i - 1; j++) {
        // 判断j当前位置的元素值 是否 大于后一个位置 若较大 则交换
        if(arr[j] > arr[j+1]) {
            int temp = arr[j+1];
            arr[j+1] = arr[j];
            arr[j] = temp;
        }
    }
}

// 遍历数组内容输出
for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i] + "\t");
}

数组的内存图

JAVA内存分配、数组内存图

image.png

image.png

两个变量指向同一个数组

image.png

数组使用的常见问题

问题1:如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException(数组索引越界异常)
问题2:如果数组变量中没有存储数组的地址,而是null, 在访问数组信息时会出现NullPointerException(空指针异常)

image.png

Debug工具的使用

Debug工具:IDEA自带的断点调试(排错)工具,可以控制代码从断点开始一行一行的执行,然后详细观看程序执行的情况。

image.png