一、数组概述数组是同一数据类型的有序集合在内存中占用连续的存储空间属于引用数据类型。数组一旦创建长度不可改变。定义格式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 →0long →0Lfloat →0.0fdouble →0.0dchar →\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()必须先升序排序找到返回索引未找到返回-(插入点)-1int[] 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类打印、排序、查找、拷贝、填充、比较引用在栈对象在堆多引用共享同一个数组方法传数组传的是地址改元素影响外部改引用不影响外部。
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 →0long →0Lfloat →0.0fdouble →0.0dchar →\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()必须先升序排序找到返回索引未找到返回-(插入点)-1int[] 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类打印、排序、查找、拷贝、填充、比较引用在栈对象在堆多引用共享同一个数组方法传数组传的是地址改元素影响外部改引用不影响外部。