1. 数组与集合的本质差异
作为一名Java老兵,我见过太多初级开发者在数组和集合之间摇摆不定。让我们先解剖两者的DNA差异,这比死记硬背API文档有用得多。
数组是Java最原始的顺序存储结构,在JVM层面直接对应着连续的内存块。当你声明int[] arr = new int[10]时,JVM会立即分配40字节的连续空间(假设是32位系统)。这种紧凑布局带来了两个关键特性:
- 随机访问O(1):计算元素地址只需
基地址 + 索引*元素大小 - 内存局部性:CPU缓存预取机制对这种连续存储特别友好
但硬币的反面是:
java复制// 典型数组痛点示例
String[] fixedArray = new String[3];
fixedArray[3] = "overflow"; // 运行时抛出ArrayIndexOutOfBoundsException
相比之下,集合框架的ArrayList内部虽然也使用数组,但通过自动扩容机制实现了动态生长。其扩容算法值得玩味:
java复制// JDK中的扩容核心逻辑
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); // 1.5倍扩容
elementData = Arrays.copyOf(elementData, newCapacity);
}
关键经验:当元素数量可预测且不变时,数组的内存效率比ArrayList高约15-20%(实测数据)。但在90%的业务场景中,这点性能差异远不如开发效率重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 内存占用与性能实测对比
让我们用JMH做一组严谨的基准测试(测试环境:JDK17, MacBook Pro M1):
| 数据结构 | 插入100万元素耗时(ms) | 内存占用(MB) | 随机访问耗时(ns) |
|---|---|---|---|
| int[] | 12 |
