数组长度应“刚好够用+适度余量”,避免过大浪费内存或过小引发频繁扩容/异常;推荐按业务场景预估(如班级64、http头32、日志1200),动态场景优先用arraylist收集后转数组,复用数组并警惕二维数组隐式开销。

数组长度设得过大,浪费堆内存;设得太小,频繁扩容或抛出异常。关键不是“尽量大”,而是“刚好够用+适度余量”。
根据实际数据量预估长度
避免凭感觉写 new int[10000] 这类魔法数字。先梳理业务场景中数组元素的典型数量级:
- 学生班级成绩统计 → 通常 30–60 人 → 可设
new double[64](选 2 的幂便于 JVM 对齐) - HTTP 请求头字段 → 多数不超过 20 个 →
new String[32]更安全 - 日志缓冲区 → 按每秒峰值预估 × 缓冲时间 → 如 500 条/秒 × 2 秒 = 1000,再加 20% 余量 →
new LogEntry[1200]
用集合过渡,再转为数组(适合动态场景)
当元素数量不确定、需频繁增删时,优先用 ArrayList 或 ArrayDeque 收集数据,最后一次性转数组:
List<string> list = new ArrayList(); ... list.toArray(new String[0]);</string>- JVM 会根据
list.size()精确分配数组长度,避免冗余空间 - 比反复
Arrays.copyOf扩容效率更高,也更易读
复用已有数组,减少 new 调用
在循环或高频方法中,避免每次新建数组:
- 将数组声明为方法参数或成员变量,传入复用(注意线程安全)
- 使用
Arrays.fill(arr, 0)清空后重用,而非new int[arr.length] - 对固定尺寸缓存(如解析缓冲区),可设计为对象池,例如
ThreadLocal<int></int>每线程独享一份
警惕二维数组的隐式开销
声明 new int[1000][1000] 并不等于分配 100 万个 int 的连续内存 —— 它实际创建了 1000 个独立的一维数组对象:
- 每个一维数组有对象头(约 12–16 字节)+ 长度字段 + 元素空间,总开销远超预期
- 若逻辑上是稠密矩阵,改用一维数组模拟:
int[] matrix = new int[rows * cols],访问用matrix[row * cols + col] - 稀疏场景则考虑
Map<pair>, Integer></pair>或专用稀疏结构
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











