发布时间:2026/9/3 22:00:40
5. Java 数组核心知识点 一、数组概述1.1 什么是数组数组是相同数据类型元素的有序集合使用一个变量名管理多个同类型数据。本质是一个固定长度的容器。1.2 核心特点特点说明类型统一数组中所有元素必须是同一数据类型如全部 int 或全部 String长度固定数组一旦创建长度不可修改。length属性记录当前长度有序性元素按索引下标排列索引从 0 开始引用类型数组是引用数据类型数组名存储的是堆内存地址而非元素本身1.3 存储逻辑数组在内存中占据连续的存储空间。以int[] arr {10, 20, 30}为例堆内存中开辟 3 个连续的 int 空间每个 4 字节索引 0 对应 10、索引 1 对应 20、索引 2 对应 30。通过「数组名 索引」即可 O(1) 定位任意元素。二、数组的初始化2.1 静态初始化创建数组时直接指定元素值长度由元素个数自动推断。适用于已明确所有元素值的场景。三种写法// 写法1简化版推荐 数据类型[] 数组名 {元素1, 元素2, 元素3, ...}; // 写法2完整版 数据类型[] 数组名 new 数据类型[]{元素1, 元素2, 元素3, ...}; // 写法3声明与初始化分离 数据类型[] 数组名; 数组名 new 数据类型[]{元素1, 元素2, ...};示例int[] intArr {10, 20, 30, 40}; String[] strArr {Java, 数组, 静态初始化}; boolean[] boolArr {true, false, true};注意事项规则说明禁止同时指定长度new int[3]{1,2,3}编译错误静态初始化长度由元素个数自动计算元素必须有默认值静态初始化时元素已显式赋值不存在默认值概念默认值仅出现在动态初始化中写法3 不推荐声明与初始化分离容易忘记赋值导致空指针2.2 动态初始化先指定数组长度元素后续赋值。未赋值的元素使用对应类型的默认值。语法数据类型[] 数组名 new 数据类型[长度];示例int[] arr new int[3]; // 长度为 3元素默认值均为 0 arr[0] 10; arr[1] 20; // arr[2] 未赋值仍为默认值 0各类型默认值数据类型默认值byte / short / int / long0float / double0.0booleanfalsechar\u0000空字符引用类型String、自定义类等null2.3 静态 vs 动态初始化维度静态初始化动态初始化语法int[] arr {1,2,3};int[] arr new int[3];元素来源创建时直接指定先定长度后逐个赋值适用场景已知所有元素值元素值待计算或批量填充默认值无已显式赋值有各类型默认值三、数组的访问与遍历3.1 通过索引访问元素int[] arr {10, 20, 30}; // 读取 int first arr[0]; // 10 // 修改 arr[1] 200; // 索引 1 改为 200索引合法范围0 ~ arr.length - 1。超出范围抛出ArrayIndexOutOfBoundsException。3.2 两种遍历方式int[] arr {10, 20, 30, 40}; // 方式1普通 for 循环可获取索引、可修改元素 for (int i 0; i arr.length; i) { System.out.println(索引 i : arr[i]); } // 方式2增强 for 循环foreachJDK 1.5 for (int num : arr) { System.out.println(num); }维度普通 for增强 for可获取索引是否可修改元素是通过索引赋值否num 是副本代码简洁度一般高适用场景需要索引或修改元素的场景仅遍历读取3.3 经典练习题求和int[] arr {1, 2, 3, 4, 5}; int sum 0; for (int num : arr) { sum num; } System.out.println(sum); // 15查找最大值int[] arr {12, 45, 9, 78, 33}; int max arr[0]; for (int i 1; i arr.length; i) { if (arr[i] max) { max arr[i]; } } System.out.println(max); // 78反转双指针法int[] arr {1, 2, 3, 4, 5}; int left 0, right arr.length - 1; while (left right) { int temp arr[left]; arr[left] arr[right]; arr[right] temp; left; right--; } // 结果: {5, 4, 3, 2, 1}四、数组的内存原理理解数组在 JVM 内存中的存储方式是排查空指针和引用传递问题的前提。4.1 JVM 内存分区简化内存区域存储内容特点虚拟机栈Stack局部变量、方法调用栈帧、数组名引用线程私有方法结束即销毁堆Heap数组对象、类的实例对象线程共享由 GC 回收方法区Method Area类的元数据、静态变量、常量池线程共享JDK 8 后称元空间数组涉及的核心区域栈存引用 堆存实体。4.2 逐行拆解以下代码的内存变化int a 10; int[] arr; arr new int[3]; arr[0] 20; arr[1] 30; arr new int[2];阶段栈main 栈帧堆int a 10;a 10, arr null—arr new int[3];a 10, arr 0x0011地址 0x0011: {length:3, [0]0, [1]0, [2]0}arr[0] 20; arr[1] 30;a 10, arr 0x0011地址 0x0011: {length:3, [0]20, [1]30, [2]0}arr new int[2];a 10, arr 0x4455地址 0x4455: {length:2, [0]0, [1]0}地址 0x0011 成为垃圾对象等待 GC关键结论arr new int[2]将引用指向新数组后旧数组失去引用成为垃圾对象。4.3 内存图示意栈区Stack 堆区Heap ┌─────────────┐ ┌──────────────────┐ │ a 10 │ │ 地址 0x4455 │ │ arr 0x4455│────────→ │ int[] length2 │ └─────────────┘ │ [0]0 [1]0 │ └──────────────────┘ ┌──────────────────┐ │ 地址 0x0011 (垃圾) │ │ int[] length3 │ │ [0]20 [1]30 [2]0│ └──────────────────┘4.4 核心知识点数组名是栈中的引用变量存储堆地址而非数组本身所有数组元素无论基本类型还是引用类型都存储在堆中数组创建后未赋值时元素使用各类型默认值引用指向新地址后原数组若无其他引用将被 GC 回收基本类型变量如int a的值直接存在栈中数组引用变量存的是堆地址五、常见异常与避坑指南5.1 ArrayIndexOutOfBoundsException索引越界原因访问的索引不在0 ~ length-1范围内。int[] arr {1, 2}; System.out.println(arr[2]); // 异常长度为 2最大索引为 1避免方式遍历时始终使用i arr.length作为循环条件。5.2 NullPointerException空指针原因数组引用为 null却尝试访问元素。int[] arr null; System.out.println(arr[0]); // 异常arr 未指向任何堆内存空间避免方式确保数组已完成初始化new 或静态赋值后再访问。5.3 引用传递的副作用多个引用指向同一数组时通过任一引用修改元素都会影响所有引用int[] arr1 {1, 2}; int[] arr2 arr1; // arr2 和 arr1 指向同一数组 arr2[0] 100; System.out.println(arr1[0]); // 输出 100需要独立副本时应使用clone()或System.arraycopy()。5.4 数组地址值直接打印数组名会输出地址标识int[] arr {10, 20, 30}; System.out.println(arr); // 输出如 [I7852e922 // [ 表示数组I 表示 int 类型 后为哈希值六、面试高频考点Q1int[] arr new int[3]; System.out.println(arr.length);输出什么输出3。length是数组对象的属性存储在堆中通过引用读取。Q2int[] arr null; arr[0] 10;会怎样抛出NullPointerException。arr 为 null没有指向堆中的数组无法访问元素。Q3基本类型变量和数组引用变量的区别基本类型变量如int a 10的值直接存储在栈中数组引用变量如int[] arr的值是堆地址真正的数组数据在堆中。Q4静态初始化能同时指定长度吗不能。new int[3]{1, 2, 3}会编译错误。静态初始化的长度由元素个数自动计算。Q5int[] a {10}; int[] b a; b[0] 20;后a[0]是多少20。a 和 b 指向同一个堆数组修改 b[0] 等价于修改同一块内存。总结速查主题核心要点数组本质相同类型、固定长度、有序集合、引用类型静态初始化int[] arr {1,2,3};直接给元素长度自动计算动态初始化int[] arr new int[3];先定长度元素有默认值元素访问arr[index]索引范围 0 ~ length-1遍历普通 for灵活 / 增强 for简洁内存模型栈存引用地址堆存数组实体常见异常索引越界、空指针、引用传递副作用

相关新闻

2026/9/3 22:00:40

STM32F4x7+FreeRTOS+lwIP+SSL+MQTT:从能连到稳定运行的实战指南

简介:面向STM32F4x7平台与物联网嵌入式开发者,这是一套可直接落地的网络通信工程,整合FreeRTOS、LwIP协议栈、MQTT客户端及SSL安全层,适合需要快速搭建稳定联网方案或进行二次开发的项目。资源包共1451个文件、14.37MB&#xff0c…

2026/9/3 23:05:52

WeChatMsg 使用指南:把微信聊天记录导出成文档并做年度统计

WeChatMsg 使用指南:把微信聊天记录导出成文档并做年度统计 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/…

2026/9/3 23:05:52

Layui Web UI 组件库:从引入到常用组件场景的完整指南

Layui Web UI 组件库:从引入到常用组件场景的完整指南 【免费下载链接】layui 一套遵循浏览器原生态开发模式的 Web UI 组件库。 项目地址: https://gitcode.com/GitHub_Trending/la/layui Layui 是一套遵循浏览器原生态开发模式的 Web UI 组件库&#xff0c…

2026/9/3 23:05:52

从DJ Set到编排系统:技术人如何用拆解思维听透一场Trance混音

打开一场名为“铁叔电台 PRISMATIC 031 | Tiesto DJ Set | Trance Rave Mix”的混音节目,很多人会直接把它当成背景音:一边放着,一边写代码、刷网页、收拾屋子。等到回过神来,四五十分钟已经过去,你“听完了一整场”&a…

2026/9/3 23:05:52

偶像企划粉丝内容运营:转载不违规、吐槽不招黑的实操指南

最近在整理粉丝向内容的时候,碰到一个标题很有代表性的帖子:【ミリプロ/转载】【3字以心传心】吐槽担当虹深ぬふw。乍一看像随手发的动态,但拆开看,这里面包含了企划简称、转载标记、互动格式、人设标签、署名昵称五层信息。这类内…

2026/9/3 23:00:52

Bootmapper Client 实战:启动配置映射与管理工具解析

简介:Bootmapper Client V0.10.0 是一款面向 BFACE 方案机械键盘的深度定制工具,适合 DIY 玩家、程序开发与游戏用户使用。它提供键盘宏编辑、自定义组合键以及 LED 背光模式调整等功能,可将普通键盘改造成贴合个人习惯的高效输入设备。压缩包…

2026/9/3 18:28:26

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/3 14:29:47

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/3 14:30:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/3 0:02:06

零基础装 OpenClaw 小龙虾 AI:Windows 一键部署教程与避坑要点

Windows 部署 OpenClaw 完整教程|本地 AI 智能体 5 分钟落地,环境配置一次搞定 版本说明:Windows 3.1.0 / Mac 2.7.9 写在前面 近两年开源 AI 领域有一款被称作「数字员工」的工具持续走热,它就是 OpenClaw,圈内人更习…

2026/9/3 0:02:06

Hermes Agent 本地部署新方案:Windows 整合包减少依赖报错

Windows 本地部署 Hermes 太麻烦?这版一键包 5 分钟快速跑通 很多人想体验 Hermes Agent,但真正开始部署时,往往会卡在环境配置这一步。 需要安装各类依赖、调试运行环境、处理路径问题,还容易遇到命令行报错、系统拦截、文件缺…

2026/9/3 0:02:06

实测 OpenClaw 一键包,5 分钟完成本地自动化环境搭建

OpenClaw 本地 AI 自动化工具部署指南|使用一键包规避环境配置难题 痛点:部署 AI 自动化工具常常要处理 Python、Node.js 各类依赖,版本冲突、环境配置耗费大量时间,OpenClaw 提供一键安装包,降低部署门槛。 适配系统&…

2026/9/3 20:43:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/3 17:51:43

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/3 21:06:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…