Java学习笔记——第四天

数组

数组是什么

数组就是一个容器,用来存一批同种类型的数据。

数组有什么用

遇到批量数据的存储和操作时,数组比变量更适合。代码简洁,逻辑清晰。

数组的定义

静态初始化数组

定义数组的时候直接给数组赋值。

格式1(完整格式)

数据类型[] 数组名 = new 数据类型[]{元素1,元素2 ,元素3… };

格式2(简化格式)

数据类型[] 数组名 = { 元素1,元素2 ,元素3,… };

使用场景

适合一开始就知道要存入哪些元素值的业务场景。

动态初始化数组

定义数组时先不存入具体的元素值,只确定数组存储的数据类型和数组的长度。

格式

数据类型[] 数组名 = new 数据类型[长度];

使用场景

  • 适合开始不确定具体元素值,只知道元素个数的业务场景。
  • 先定义数组,后赋值数据进去。

动态初始化数组元素默认值规则

动态初始化数组元素默认值规则

数组的访问

格式

数组名称[索引]

取值

int data = arr[1];

赋值

arr[1] = 1;

数组长度

数组名称.length
  • 数组的最大索引是“数组名称.length - 1”(前提:元素个数大于0)

数组的遍历

什么是遍历

就是依次访问数组中的每个元素。

为什么要遍历数组

业务开发中需要用到:统计数据,搜索数据...

如何遍历数组

int[] arr = {1, 2, 3, 4, 5};
for (i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

数组的执行原理

Java的内存分配

Java会在计算机内存中运行一个JVM程序,Java的程序都在JVM中运行,Java将JVM虚拟机的内存分为五部分:

  • 方法区:用于存放字节码文件。
  • 栈:用于存放运行的方法和变量。
  • 堆:用于存放用new关键字创建的对象。
  • 本地方法栈
  • 寄存器

Java程序的执行原理

  1. Java程序开始运行后,其class文件会被提取到方法区,然后一行一行地运行class文件。
  2. 将运行过程中的方法和变量存放在栈中,由new关键字创建的对象被存放在堆中。
  3. 依次运行直到程序结束。

数组的执行原理

  1. 当运行到定义数组的代码时,数组变量被存放在栈中,而数组对象被存放在堆中。
  2. 栈中的数组变量的被赋值为堆中的数组变量的地址。

多个数组变量指向同一个数组对象

  • 多个数组变量可以指向同一个数组对象,只要这些数组变量中存储的是同一个数组对象的地址。
  • 多个变量修改的都是同一个数组对象中的数据。
  • 一旦数组对象中的数据被修改,则所有数组变量访问出的值都会被修改。

空指针

  • 如果某个数组变量存储的地址是null,那么该变量将不再指向任何数组对象。
  • 此时访问其对象会出现异常。

数组的注意事项

  • 什么类型的数组只能存放什么类型的数据。
  • “数据类型[] 数组名”也可写成 “数据类型 数组名[] ”。
  • 数组变量名中存储的是数组在内存中的地址,数组是一种引用数据类型。
  • 数组一旦定义出来,其长度和类型就固定了。
  • 不要访问超过数组的最大索引,否则会出现数组访问越界异常。

数组应用案例

数组求最值

需求

找出数组中元素的最大值。

实现步骤

  1. 把数据输入到数组中。
  2. 定义一个变量max用于记录最终的最大值。
  3. 从第二个位置开始遍历数组的数据,如果遍历的当前数据大于max变量存储的数据,则替换变量存储的数据为当前数据。
  4. 循环结束后输出max变量。

代码

public class MaxOfArray {
    public static void main(String[] args) {
        int[] arr = {5, 9, 4, 6, 7}; //定义数组

        int max = arr[0]; //记录数组的最大值,初始化为数组的第一个元素

        //从第二个位置开始遍历数组,并将max与这些元素依次比较,将较大值存入max
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }

        System.out.println(max); //输出数组元素的最大值
    }
}

数组反转

需求

某个数组有5个数据:10,20,30,40,50,请将这个数组中的数据进行反转。

实现步骤

  1. 使用for循环,让数组的首尾位置的元素依次交换。
  2. 定义一个临时变量存储前一个位置处的元素值。
  3. 再把后一个位置处的元素值,赋值给前一个位置处。
  4. 最后把临时变量存储的前一个位置的值赋值给后一个位置处。

代码

public class ArrayReverse {
    public static void main(String[] args) {
        int[] arr = {10, 20, 30, 40, 50}; //定义数组

        //使用for循环,让数组的首尾位置的元素依次交换。
        for (int i = 0; i < arr.length / 2; i++) {
            int temp = arr[i]; //定义一个临时变量存储前一个位置处的元素值
            arr[i] = arr[arr.length - 1 - i]; //再把后一个位置处的元素值,赋值给前一个位置处
            arr[arr.length - 1 - i] = temp; //最后把临时变量存储的前一个位置的值赋值给后一个位置处
        }

        //遍历打印数组,查看交换后的数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

随机排名

需求

某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。请先依次录入5名员工的工号,然后展示出一组随机的排名顺序。

实现步骤

  1. 定义一个动态初始化的数组用于录入员工的工号。
  2. 遍历数组中的每个元素。
  3. 每遍历到一个数据,都随机一个索引值出来,让当前数据与该索引位置处的数据进行交换。
  4. 输出数组中的内容。

代码

import java.util.Random;
import java.util.Scanner;

public class ArrayShuffle {
    public static void main(String[] args) {
        int[] workId = new int[5]; //定义一个动态初始化的数组

        Scanner sc = new Scanner(System.in); //获取Sacnner对象
        Random r = new Random(); //获取Random对象

        //循环输入5名员工的工号
        for (int i = 0; i < workId.length; i++) {
            System.out.println("请输入第" + (i + 1) + "名员工的工号");
            workId[i] = sc.nextInt();
        }

        //遍历数组中的每个元素并随机打乱
        for (int i = 0; i < workId.length; i++) {
            int index = r.nextInt(5); //随机一个索引值

            //让当前数据与该索引位置处的数据进行交换
            int temp = workId[i];
            workId[i] = workId[index];
            workId[index] = temp;
        }

        //遍历打印数组,查看交换后的数组
        for (int i = 0; i < workId.length; i++) {
            System.out.println(workId[i]);
        }
    }
}

补充:Debug工具的使用

Debug工具是什么

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

Debug工具的基本使用步骤

  1. 在需要控制的代码行左侧,点击一下,形成断点。
  2. 选择使用Debug方式启动程序,启动后程序会在断点处暂停。
  3. 控制代码一行一行的往下执行,同时可以观察所有变量的值。
posted @ 2024-03-03 13:02  zgg1h  阅读(33)  评论(0)    收藏  举报