Java:数组的定义和使用(万字解析)

发布时间:2026/7/4 23:35:49

Java:数组的定义和使用(万字解析) Java 中的数组Array是最基础、最常用的固定长度、连续存储的数据结构。它属于引用数据类型在堆内存中分配空间。下面从零基础到高级、从语法到内存到最佳实践全面解析目标约万字深度但这里精炼为结构清晰的完整指南适合学习、面试、日常开发使用。内容基于Java 212025–2026 主流写法。1. 为什么 Java 需要数组核心定位存储大量同类型数据提供O(1)随机访问下标访问内存连续→ 缓存友好性能极高但长度不可变→ 这是数组最大局限对比 ArrayList2. 数组的四种基本声明方式语法糖演变写法序号声明语法推荐程度2026年说明1int[] arr;★★★★★最推荐可读性强类型在前2int arr[];★★☆☆☆C/C 风格不推荐3int... arr可变参数—仅用于方法参数本质是数组4int Nullable[] arr注解风格★★★★☆现代项目中常见配合空安全工具推荐统一风格始终使用类型\[\] 变量名方式1。3. 数组的创建初始化方式全解最常考3.1 方式一静态初始化最常用、最安全// 方式一完整写法new 花括号int[]scoresnewint[]{85,92,78,95};// 方式二简化写法推荐编译器自动推断 new int[]int[]scores{85,92,78,95};// 只能在声明时使用String[]names{Alice,Bob,Charlie};// 空数组长度0int[]emptynewint[0];// 或 {}int[]empty2{};// 同上3.2 方式二动态初始化先创建后赋值// 先声明 创建默认值填充int[]arrnewint[5];// 长度5全部初始化为 0// 基本类型默认值一览非常重要byte/short/int/long→0float/double→0.0char→ boolean→false引用类型String等 →null// 逐个赋值arr[0]10;arr[1]20;// ...3.3 方式三先声明后 new延迟初始化int[]arr;// 只声明栈中存 nullarrnewint[10];// 堆中真正分配4. 多维数组本质数组的数组Java没有真正的多维数组只有数组的数组jagged array不规则数组。4.1 规则矩形二维数组最常见// 声明 创建3行4列int[][]matrixnewint[3][4];// 静态初始化int[][]matrix2{{1,2,3,4},{5,6,7,8},{9,10,11,12}};// 访问matrix[行][列]matrix[0][0]100;System.out.println(matrix[2][3]);// 124.2 不规则锯齿状二维数组面试高频int[][]jaggednewint[3][];// 第一维必须指定jagged[0]newint[2];// 长度2jagged[1]newint[5];// 长度5jagged[2]newint[1];// 长度1// 更常见写法int[][]jagged2{{1,2},{3,4,5,6,7},{8}};内存图关键点常考画图题jagged → [引用] → { [引用], [引用], [引用] } ↓ ↓ ↓ {1,2} {3,4,5,6,7} {8}5. 数组常用操作必会操作代码示例时间复杂度说明长度arr.lengthO(1)属性不是方法遍历推荐for(int num : arr)O(n)增强for循环只读最安全普通for遍历for(int i0; iarr.length; i)O(n)需要下标时使用打印Arrays.toString(arr)—必须 import java.util.Arrays排序Arrays.sort(arr)O(n log n)基本类型快排 / 对象需实现Comparable二分查找有序Arrays.binarySearch(arr, key)O(log n)必须先排序负数表示插入点填充Arrays.fill(arr, 0)O(n)全部填充同一个值复制Arrays.copyOf(arr, newLength)O(n)产生新数组比较Arrays.equals(arr1, arr2)O(n)内容比较不是 深比较多维Arrays.deepEquals(arr1, arr2)O(n)多维数组专用6. 常见坑 最佳实践2025–2026 面试重灾区排名坑 / 错误做法正确 / 推荐做法为什么重要后果1int[] a new int[5]; a[5] 1;下标永远 lengthArrayIndexOutOfBoundsException2直接用比较两个数组用Arrays.equals()或Arrays.deepEquals() 比较的是引用地址3String[] strs {a,b}; strs.length()strs.length属性编译错误4大量使用new int[1000000]循环创建尽可能复用数组 Arrays.fill()频繁GC、内存碎片5多维数组不规则时直接matrix[i][j]先判断matrix[i] ! null j matrix[i].lengthNullPointerException 或越界6Arrays.asList() 后调用 add/removenew ArrayList(Arrays.asList(...))或 List.of()UnsupportedOperationException7基本类型数组转 ListArrays.stream(arr).boxed().toList()(Java 16)否则只能手动循环8认为数组长度可变需要变长 → 用 ArrayList / LinkedList数组天生固定长度9大数组直接System.out.println(arr)永远用Arrays.toString()/deepToString()只打印 hashCode7. 数组 vs ArrayList选择依据表面试必问维度数组 (int[] / String[])ArrayList / ArrayList选择建议2026主流长度固定动态长度确定 → 数组不确定 → List性能访问最快O(1)无装箱稍慢有装箱/拆箱高性能场景优先数组内存占用更省连续 无额外对象头更多每个元素包装成对象大数据量优先数组方法丰富度极少丰富add/remove/contains/indexOf 等频繁操作选 List泛型支持不支持支持需要泛型 → List多线程安全非线程安全非线程安全但有 Collections.synchronizedList多线程慎用两者2026 年真实趋势数值计算、性能敏感场景游戏、科学计算、算法题 → 优先原生数组业务代码、集合操作频繁 → 几乎全用 ArrayList / List.of() / Arrays.asList()只读场景8. 经典面试手写题建议全部手敲一遍反转数组原地 / 新数组两种找出数组中出现次数最多的元素HashMap / 排序后统计二维数组顺时针旋转 90°杨辉三角前 n 行合并两个有序数组原地合并到第一个数组删除有序数组中的重复元素返回新长度寻找峰值二分法 O(log n)需要哪一道题的详细代码 复杂度分析 边界case或者想看某个具体场景的完整示例排序 搜索 多维 性能对比告诉我我可以继续展开。

相关新闻