《Java 100 天进阶之路》第31篇:Java数组详解

第31篇:Java数组详解

📌 系列导航《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第30篇:Date类、Calendar类、date转calendar |
➡️ 下一篇:第32篇:Java常用工具类(Objects、Collections、Arrays深入)


一、核心知识点

  • 数组的定义:固定长度、相同类型元素的连续内存块
  • 数组的初始化:静态初始化、动态初始化
  • 数组的遍历:普通 for、增强 for
  • 内存结构:数组变量在栈,数组对象在堆
  • 多维数组:数组的数组(可非矩形,即“交错数组”)
  • Arrays 工具类常用方法:sort()binarySearch()fill()equals()toString()copyOf()

二、通俗讲解(1分钟开心学)

1. 数组是什么?

数组是一个容器,可以存放多个相同类型的数据。它有两个重要特征:

  • 长度固定:一旦创建,不能增加或减少。
  • 类型统一:要么全是 int,要么全是 String 等。

生活类比:数组就像一个带编号的储物柜,柜子数量固定(长度),每个格子只能放同一种类型的东西(类型统一),你可以通过编号(索引)快速存取。

2. 数组的声明与初始化

  • 静态初始化:创建时直接指定元素值。int[] arr = {1,2,3};
  • 动态初始化:先指定长度,后赋值。int[] arr = new int[5]; 元素有默认值(int→0,boolean→false,引用类型→null)。

3. 数组的内存

数组变量(引用)存储在栈内存中,指向堆中的数组对象。数组对象在堆中是一片连续的内存空间,每个元素根据类型占用固定字节。

4. 多维数组——数组的数组

Java中没有真正的二维数组,二维数组实际上是“数组的数组”。每个内层数组可以长度不同(非矩形数组),称为交错数组。例如int[][] ragged = new int[2][];ragged[0] = new int[2];ragged[1] = new int[5];——第一行2个格子,第二行5个格子,内存布局灵活但访问稍慢。

生活类比:多维数组就像抽屉里的文件夹。外层数组是抽屉柜(每个抽屉是一个数组引用),每个抽屉里放着一个独立的文件夹(内层数组),文件夹的页数(长度)可以各不相同。

5. Arrays 工具类

Java 提供了 java.util.Arrays,包含大量操作数组的静态方法,比如排序、二分查找、填充、比较、转字符串等。

三、实操代码案例 + 场景说明

场景:存储班级学生成绩,计算总分、最高分、排序,并体验一维与二维数组。

import java.util.Arrays;

public class ArrayDemo {
    public static void main(String[] args) {
        // ========== 一维数组 ==========
        // 1. 静态初始化
        int[] scores = {85, 92, 78, 90, 88};
        
        // 2. 动态初始化
        int[] another = new int[10]; // 默认值0
        
        // 3. 遍历求总分和最高分
        int sum = 0;
        int max = scores[0];
        for (int i = 0; i < scores.length; i++) {
            sum += scores[i];
            if (scores[i] > max) max = scores[i];
        }
        System.out.println("总分:" + sum + ",平均分:" + (double)sum / scores.length);
        System.out.println("最高分:" + max);
        
        // 4. 增强 for 循环
        System.out.print("成绩列表:");
        for (int score : scores) {
            System.out.print(score + " ");
        }
        System.out.println();
        
        // 5. 排序
        Arrays.sort(scores);
        System.out.println("排序后:" + Arrays.toString(scores));
        
        // 6. 二分查找(需先排序)
        int index = Arrays.binarySearch(scores, 88);
        System.out.println("88 的索引:" + index);
        
        // 7. 数组拷贝
        int[] copy = Arrays.copyOf(scores, scores.length + 2);
        System.out.println("拷贝后长度:" + copy.length);
        
        // ========== 二维数组(交错数组) ==========
        // 方法一:规则矩阵
        int[][] matrix = new int[2][3];
        matrix[0][0] = 1;
        matrix[0][1] = 2;
        matrix[1][0] = 3;
        
        // 方法二:动态指定内层长度(交错数组)
        int[][] ragged = new int[2][];
        ragged[0] = new int[2];   // 第一行2个元素
        ragged[1] = new int[5];   // 第二行5个元素
        
        // 打印二维数组各行的长度
        for (int i = 0; i < ragged.length; i++) {
            System.out.println("第" + i + "行长度:" + ragged[i].length);
        }
        
        // 静态初始化二维数组
        int[][] static2D = {
            {1, 2, 3},
            {4, 5},
            {6, 7, 8, 9}
        };
        System.out.println("\n二维数组遍历结果:");
        for (int i = 0; i < static2D.length; i++) {
            for (int j = 0; j < static2D[i].length; j++) {
                System.out.print(static2D[i][j] + " ");
            }
            System.out.println();
        }
    }
}

四、避坑要点

错误/误区后果正确做法
数组越界访问 arr[arr.length]ArrayIndexOutOfBoundsException索引范围 0 到 length-1
多维数组中内层数组未初始化NullPointerExceptionnew 内层数组再使用
int[] arr = {1,2,3}; int[] arr2 = arr; 以为复制了数组arr2 只是引用,改变 arr2 会影响 arrArrays.copyOf()System.arraycopy()
Arrays.asList() 返回的 List 不能增删调用 add/removeUnsupportedOperationExceptionnew ArrayList<>(Arrays.asList(arr))
混淆数组长度属性 length 和字符串方法 length()编译错误数组用 .length,字符串用 .length()
创建二维数组时仅声明外层而未初始化内层就存取NullPointerException先为每一行分配独立的一维数组

五、面试高频考点

Q1:数组和 ArrayList 的区别?

数组长度固定,可存储基本类型,效率高;ArrayList 长度可变,只能存储对象,提供了丰富 API(增删改查),但底层也是数组。

Q2:如何将数组转换为 List?

List<String> list = Arrays.asList(arr); 返回的是固定大小的 Arrays.ArrayList,不能增删。如需可变:new ArrayList<>(Arrays.asList(arr))

Q3:数组在内存中如何存储?

数组变量(引用)在栈中,指向堆中的数组对象。数组对象包含长度信息,以及连续存储的元素(基本类型值或对象引用)。

Q4:二维数组在内存中是如何存储的?

Java 中没有真正的二维数组,二维数组本质是“数组的数组”——外层数组存储的是内层数组的引用地址,内层每个一维数组在堆内存中独立存储。这也意味着每一行的长度可以不同。

Q5:什么是交错数组?有什么优缺点?

交错数组指二维数组中每一行的长度可以不同。优点是内存灵活,适合非表格形式的数据;缺点是访问时需要两次寻址(先找行数组引用,再找元素),速度略慢于规则矩阵,且遍历时需额外注意。

六、练习题

  1. 编程:手写冒泡排序对 int 数组排序。
  2. 理解:创建二维数组 int[][] arr = new int[3][]; 然后分别给每行分配不同长度(如2、4、6),并填充数据(如用双层循环赋值)。
  3. 代码填空:给定两个已排序的数组,合并成一个新的有序数组(归并思想)。

📊 你的学习进度

  • 当前:第31篇 / 共44篇 · 第四阶段:注解、反射、代理、日期(第26~31篇)
  • ✅ 已完成:第1~30篇
  • 📖 正在学:第31篇
  • ⏳ 待学习:第32~44篇

👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇

💡 本专栏每篇都包含:避坑表 + 面试高频考点 + 练习题。每天30分钟,100天拿offer!


👉 下一篇文章预告

《第32篇:Java常用工具类(Objects、Collections、Arrays深入)》

内容简介:Objects 的 null 安全方法、Collections 的排序/反转/不可变集合、Arrays 的数组操作,以及 Comparable 与 Comparator 排序。

💡 学完这篇,你将掌握 Java 工具箱里的瑞士军刀,写出更简洁高效的代码。

📌 《Java 100 天进阶之路 | 从入门到上岗就业》 每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!
📌 除了Java,我也在深挖智能物流实战(出版社WMS、托盘调度、机器学习落地)。如果你对技术在不同领域的实战感兴趣,欢迎点击我的头像,看看专栏《出版社物流WMS智能调度实战》。技术相通,思路可鉴。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值