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 空指针异常
七、方法中数组引用的应用(重难点)
核心原理
数组是引用类型,方法传参传递的是地址,不是拷贝。
两大铁律:
方法内修改数组元素→ 原数组改变
方法内给形参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; // 返回数组的引用地址 }八、总结
数组是同类型、定长、连续空间的引用类型;
三种初始化:简写静态、标准静态、动态初始化;
基本类型默认0/0.0/false,引用类型默认null;
普通for带下标可改值,for-each简洁只读;
Arrays类:打印、排序、查找、拷贝、填充、比较;
引用在栈,对象在堆,多引用共享同一个数组;
方法传数组传的是地址,改元素影响外部,改引用不影响外部。