当前位置: 首页 > news >正文

Java 数组全套精讲(定义、初始化、默认值、遍历、Arrays工具类、引用机制、方法传参)2026.7.11

一、数组概述

数组是同一数据类型的有序集合,在内存中占用连续的存储空间,属于引用数据类型

数组一旦创建,长度不可改变。

定义格式:

int[] a;(推荐)

int a[];(不推荐,兼容C语言写法)

二、数组三种初始化方式

1. 静态初始化简写

直接赋值,自动确定数组长度

int[] arr = {1,2,3,4};

2. 标准静态初始化

支持先声明后赋值

int[] arr = new int[]{1,2,3,4};

3. 动态初始化(仅开辟空间)

只指定数组长度,系统自动赋默认值

int[] arr = new int[10];

三、数组默认初始化值

动态初始化后,数组元素自动赋值:

  • byte、short、int →0

  • long →0L

  • float →0.0f

  • double →0.0d

  • char →\u0000(空字符,不可见)

  • boolean →false

  • 所有引用类型 →null

四、数组两种遍历方式

1. 普通 for 循环(带下标、可修改元素)

适用场景:需要索引、需要修改数组内容

int[] arr = {10,20,30,40}; for(int i = 0; i < arr.length; i++){ System.out.println(arr[i]); }

2. 增强 for 循环 for-each(只读、无下标)

适用场景:只读取数据,代码简洁

缺点:无法获取索引,不能修改原数组元素

public class Main { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5}; // 示例数组 for(int num : arr){ System.out.println(num); } } }
for (元素类型 变量名 : 数组或集合) { // 循环体 }
  • int num:声明一个临时变量num,类型与数组元素类型一致(此处为int)。
  • : arr:指定要遍历的数组arr
  • System.out.println(num):在每次循环中打印当前元素的值。

五、Arrays 工具类常用方法

导包:import java.util.Arrays;

1. 数组打印

  • Arrays.toString():打印一维数组

  • Arrays.deepToString():打印多维数组

import java.util.Arrays; public class ArrayPrintExample { public static void main(String[] args) { int[] arr = {1, 2, 3}; System.out.println(Arrays.toString(arr)); int[][] arr2 = {{1, 2}, {3, 4}}; System.out.println(Arrays.deepToString(arr2)); } }

2. 数组排序 sort()

  • 基本类型:默认升序

  • 包装类数组:可自定义排序规则

    int[] arr = {5, 2, 9}; Arrays.sort(arr); // 升序排序 System.out.println(Arrays.toString(arr)); // 输出结果

    降序排序(包装类数组)

    Integer[] nums = {3, 1, 2}; Arrays.sort(nums, (a, b) -> b - a); // 降序排序 System.out.println(Arrays.toString(nums)); // 输出结果
  • 基本类型数组(如int[])只能使用默认的升序排序
  • 降序排序需要使用包装类数组(如Integer[]
  • Lambda表达式(a, b) -> b - a实现了降序比较逻辑

3. 二分查找 binarySearch()

必须先升序排序

找到返回索引,未找到返回:-(插入点)-1

int[] arr = {1,2,3,5,9}; int index = Arrays.binarySearch(arr,5);

4. 数组拷贝

  • copyOf:从头拷贝,可扩容/缩容

  • copyOfRange:区间拷贝(左闭右开)[ )

int[] arr = {1,2,3}; int[] newArr = Arrays.copyOf(arr,5); int[] sub = Arrays.copyOfRange(arr,1,3);

5. 数组填充 fill()

批量给数组赋值

Arrays.fill(arr,8); // 全部填充

Arrays.fill(arr,1,3,6); // 区间填充

6. 数组内容比较

  • equals:比较一维数组内容

  • deepEquals:比较多维数组内容

六、数组引用机制(核心考点)

1. 内存分布

引用在栈,对象在堆

  • 栈:数组引用变量(存堆地址)

  • 堆:数组真实数据(连续空间)

2. 引用特点

  • 一个引用同一时刻只能指向一个对象

  • 一个对象可以被多个引用指向

int[] a = {1,2,3}; int[] b = a; b[0] = 99; // a、b同时变化

3. == 与 equals 区别

  • ==:比较地址(是否同一个数组)

  • Arrays.equals():比较数组内容

4. null 空引用

数组变量 = null:引用不指向任何堆空间

再次访问数组元素 →NullPointerException 空指针异常

七、方法中数组引用的应用(重难点)

核心原理

数组是引用类型,方法传参传递的是地址,不是拷贝

两大铁律:

  1. 方法内修改数组元素→ 原数组改变

  2. 方法内给形参new新数组→ 原数组不变

场景1:方法内修改数组元素(外部受影响)

public static void change(int[] arr) { arr[0] = 999; // 修改传入数组的第一个元素 } public static void main(String[] args) { int[] nums = {10, 20, 30}; // 原始数组 change(nums); // 传递数组引用,修改原数组 // 此时nums[0]的值变为999 }

场景2:形参重新new数组(外部不受影响)

public class ArrayResetExample { public static void reset(int[] arr) { arr = new int[3]; // 只改变局部引用 arr[0] = 888; } public static void main(String[] args) { int[] originalArray = {1, 2, 3}; System.out.println("调用前: " + Arrays.toString(originalArray)); reset(originalArray); System.out.println("调用后: " + Arrays.toString(originalArray)); } }

场景3:方法返回数组引用

public static int[] getNewArray() { int[] arr = {1, 2, 3}; // 在堆内存中创建数组对象 return arr; // 返回数组的引用地址 }

八、总结

  1. 数组是同类型、定长、连续空间的引用类型;

  2. 三种初始化:简写静态、标准静态、动态初始化;

  3. 基本类型默认0/0.0/false,引用类型默认null;

  4. 普通for带下标可改值,for-each简洁只读;

  5. Arrays类:打印、排序、查找、拷贝、填充、比较;

  6. 引用在栈,对象在堆,多引用共享同一个数组;

  7. 方法传数组传的是地址,改元素影响外部,改引用不影响外部。

http://www.jsqmd.com/news/1171239/

相关文章:

  • XLSX Workbench 与 ALV 对比:3种SAP数据导出方案选型指南
  • 物理层信道复用技术 3种方案详解:FDM、TDM、CDMA 原理与带宽计算
  • 离散数学函数概念辨析:单射、满射、双射的3种判定方法与集合论基础
  • 计算机视觉完整学习路径:从CNN到Transformer的实战指南
  • Linux内存管理故障排查:从MMC误操作到系统恢复实战
  • DeepSeek-VL2:基于MoE架构的多模态视觉语言大模型技术解析
  • yuzu模拟器完全指南:如何在PC上免费畅玩Switch游戏的终极方案
  • MTTF/MTTR/MTBF 3 大指标详解:从公式推导到 SRE 实践应用
  • LTC1864与PIC18F2685高精度ADC系统设计与优化
  • 终极免费重复文件清理指南:5步掌握Czkawka/Krokiet高效磁盘管理
  • 贵阳婚纱照怎么选?样片和客片差距大吗?真实避坑经验分享
  • CLIP模型可视化实战:从原理到落地的图文匹配分析指南
  • 【电子基础——电阻】
  • Prompt+Reference+Weight三重锚定法,彻底解决图生图风格漂移与主体崩坏问题
  • TPD2017FN与PIC18F85J10在工业负载控制中的应用
  • QIODevice 异步I/O与事件循环:3种 waitFor...() 阻塞调用在GUI/网络编程中的避坑指南
  • python-电商商城平台项目源码(管理端+PC用户端+手机用户端)
  • DBeaver驱动配置终极解决方案:告别网络依赖,一键连接30+数据库
  • 黄龙病柑橘分类:精确率与召回率分析
  • 端到端自动驾驶拟人度指标化方案
  • ECharts 5.x 深色主题适配:坐标轴与网格线5步配色方案
  • 零基础深度学习实战:CNN、RNN、Transformer、GNN五大核心算法详解
  • CV大模型技术路径:从智能涌现到多模态融合的突破
  • 有向无环图(DAG)最长路径问题:从 NOIP 真题到 5 种通用建模场景
  • 王国保卫战 1-3 代 Lua 脚本反编译实战:LuaJIT 工具 + 7z 替换 2 类核心参数
  • Linux Bridge 与 veth-pair 实战:3步构建K8s Pod网络命名空间隔离与通信
  • 视觉编码器:CausalVAE 训练架构深度分析【Open-Sora-Plan】
  • Hadoop 单机版 3 大常见报错排查:SSH、JAVA_HOME 与权限问题解决
  • CLIP模型可视化分析:从嵌入空间理解到多模态应用实践
  • 仅限本周开放|2024最新ChatGPT README Prompt工程白皮书(含GPT-4-turbo+Code Interpreter双引擎验证数据)