以下是 Java 数组终极详解,覆盖 底层原理、操作技巧、高频陷阱 及 性能优化方法,帮助您全面掌握数组的精髓:
特性 | 描述 |
---|---|
存储类型 | 相同数据类型元素的连续内存块 |
长度固定 | 数组长度在创建时确定,不可动态扩展 |
索引访问 | 从0开始索引,支持随机存取(时间复杂度O(1)) |
内存分配 | 数组变量存储的是堆内存中数组对象的引用地址 |
默认值初始化 | int[] 默认0,boolean[] 默认false,对象数组默认null |
多维数组本质 | Java多维数组是数组的数组(锯齿数组支持) |
int[] arr1; // 推荐写法(语义明确)
int arr2[]; // 兼容C风格(不推荐)
// 静态初始化(显示赋值)
int[] scores1 = {90, 85, 78};
// 动态初始化(指定长度)
int[] scores2 = new int[3]; // 元素全为0
// 混合初始化
int[] scores3 = new int[]{95, 88, 76};
特殊场景:
// 对象数组默认值为null
String[] names = new String[3];
names[0] = new String("Alice"); // 需逐个初始化
数组内存模型图:
栈内存 堆内存
| arr | -> | [0x1000] | → 连续存储的数据元素
(引用变量) (数组对象头)
// 遍历(增强for循环)
int[] data = {1, 3, 5};
for(int num : data){
System.out.print(num + " ");
}
// 数组复制(避免引用共享)
int[] copy1 = Arrays.copyOf(data, data.length); // 深拷贝基础类型
int[] copy2 = data.clone(); // 等效System.arraycopy
// 数组排序
Arrays.sort(data); // 快速排序优化实现
// 快速填充/比较
Arrays.fill(data, 100); // 所有元素置为100
Arrays.equals(arr1, arr2); // 深度比较内容
// 二分查找(需先排序)
int index = Arrays.binarySearch(data, 3);
// 流式处理(Java8+)
int sum = Arrays.stream(data).sum();
// 二维数组(3行4列)
int[][] matrix = new int[3][4];
matrix[0][1] = 5;
// 静态初始化
int[][] matrixInit = {{1,2}, {3,4,5}}; // 锯齿数组(允许行长度不一)
int[][] arr = new int[3][]; // 仅分配第一维
arr[0] = new int[2]; // 后续每行单独分配
选择标准 | 数组 | ArrayList等集合 |
---|---|---|
长度可变性 | ❌ 固定长度 | ✔️ 动态扩展 |
性能开销 | ✔️ 访问速度快(无封箱) | ❌ 部分类型需封箱/拆箱 |
功能扩展 | ❌ 只提供基础操作 | ✔️ 丰富API(迭代器、批量操作等) |
内存效率 | ✔️ 紧凑存储(尤其是原始类型) | ❌ 对象引用额外内存开销 |
适用场景 | 已知长度、高频访问、原始类型数据 | 频繁增删、数据类型复杂、需要算法支持 |
int[] arr = new int[5];
arr[5] = 10; // 越界!合法索引范围是0~4
防御方案:始终确保index < arr.length
。
int[][] arr = new int[2][];
System.out.println(arr[0][0]); // 第二维未初始化
修正:必须先初始化二级数组。
boolean[] flags = new boolean[10];
System.out.println(flags[0]); // 输出false而非随机值
int[] origin = {1, 3, 5};
int[] expanded = Arrays.copyOf(origin, origin.length * 2);
// 快速逆序数组
int left = 0, right = arr.length -1;
while(left < right) {
int temp = arr[left];
arr[left++] = arr[right];
arr[right--] = temp;
}
// 直接通过内存映射操作数组(NIO)
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
Java数组核心优势:
最佳实践原则:
ArrayList
Q1: 如何判断数组是否为空?
if(arr == null || arr.length == 0) { ... }
Q2: 对象数组是否浅拷贝?
✔️ 是的,Arrays.copyOf
对对象数组执行的是浅拷贝。
Q3: 最大能创建多大的数组?
最大长度受Integer.MAX_VALUE - 8
限制(约21亿,但实际根据JVM内存而定)。