初始化应指定容量避免扩容开销,预估数量时用new arraylist(expectedsize);expectedsize为0时优选arraylist.of()或collections.emptylist();遍历时优先增强for而非传统索引for。

初始化时指定容量,避免频繁扩容
ArrayList 底层是数组,扩容(默认增长 50%)会触发 数组复制,带来额外开销。在企业级场景中,若能预估元素数量(如查询分页结果、批量导入数据),应直接使用带初始容量的构造函数:
-
new ArrayList(expectedSize)—— 避免前几次 add 引发多次扩容 - 若 expectedSize 为 0,用
ArrayList.of()或Collections.emptyList()替代 new ArrayList(),更轻量且不可变 - 注意:不要过度预留(如固定写死 10000),需结合实际业务数据分布和 GC 压力权衡
优先使用增强 for 或迭代器,慎用传统 for 索引遍历
企业代码强调可读性与安全性。增强 for(for-each)底层调用迭代器,自动处理并发修改检查;而基于 get(i) 的传统 for 容易引发越界或忽略结构性修改风险:
- ✅ 推荐:
for (String item : list)—— 简洁、安全、JVM 优化成熟 - ⚠️ 谨用:
for (int i = 0; i —— 若循环中可能 remove/add,必须改用 <code>Iterator.remove()或收集待删索引再批量处理 - ❌ 避免:
list.get(i)在高并发或复杂逻辑中裸用,易掩盖空指针或角标异常
线程安全场景不直接用 ArrayList,按需选型
ArrayList 本身非线程安全。企业系统常见多线程协作(如缓存预热、异步批处理),不能简单加 synchronized 包裹整个 list 操作——这会严重降低吞吐:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 读多写少 → 用
Collections.unmodifiableList(new ArrayList())+ 外部同步写入 - 高频并发读写 → 改用
CopyOnWriteArrayList(适合读远大于写的监听器列表等场景) - 需强一致性 & 高性能 → 考虑
ConcurrentLinkedQueue或分段加锁封装,而非硬套 ArrayList - 切记:不要在 synchronized 块里对 ArrayList 做耗时操作(如远程调用、IO),否则成为性能瓶颈点
泛型必须显式声明,禁用原始类型
企业项目强调可维护性与早期错误发现。使用原始 ArrayList 会丢失类型信息,导致运行时 ClassCastException,且 IDE 和静态检查工具无法介入:
- ✅ 正确:
ArrayList<orderdetail> orderDetails = new ArrayList();</orderdetail> - ❌ 错误:
ArrayList orderDetails = new ArrayList();—— 即使历史代码也应逐步修复 - 搭配 Lombok 的
@Data或 MapStruct 转换时,确保泛型边界清晰(如List extends Product>),避免桥接方法隐患
释放引用、及时清理,防止内存泄漏
企业应用常驻运行,ArrayList 若持有长生命周期对象(如 Spring Bean、大文件流、数据库连接上下文),未及时清理将导致 OOM:
- 局部变量无需手动清空,但类成员字段在重用前建议
list.clear()或重新 new - 缓存型 list(如用户权限集合)要配合弱引用(
WeakReference<list>></list>)或使用 Caffeine 等专业缓存库 - 日志打印前做 size 截断(
list.subList(0, Math.min(100, list.size()))),防止调试日志拖垮堆内存
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










