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. 方法传数组传的是地址,改元素影响外部,改引用不影响外部。