arraylist适合频繁随机访问、较少增删中间元素的场景,底层为object[]数组,get/set为o(1);非末尾增删触发o(n)复制;扩容按1.5倍增长,建议预设容量;线程不安全;泛型擦除后存object,基本类型需注意装箱开销;trimtosize()需手动调用释放内存。
ArrayList 适合频繁随机访问、较少增删中间元素的场景
当你的业务逻辑主要涉及按索引读取、遍历、在末尾添加或删除元素时,ArrayList 是最优选。它底层是 Object[] 数组,get(int index) 和 set(int index, E element) 都是 O(1) 时间复杂度。
常见适用场景包括:
- 缓存一批配置项,后续只读不改(如
List<config> configs = new ArrayList();</config>) - 批量接收 HTTP 请求参数后做统一校验(索引访问字段值)
- 作为方法返回值传递只读数据集合(配合
Collections.unmodifiableList())
但要注意:在非末尾位置调用 add(int index, E element) 或 remove(int index) 会触发数组复制,时间复杂度升至 O(n),此时应考虑 LinkedList 或重构逻辑。
扩容机制决定内存占用与性能拐点
ArrayList 默认初始容量为 10,每次扩容不是 +1,而是按 1.5 倍增长(JDK 17+),即 newCapacity = oldCapacity + (oldCapacity >> 1)。扩容需新建数组并 System.arraycopy() 复制,有明显开销。
立即学习“Java免费学习笔记(深入)”;
如果你能预估大小,务必显式指定初始容量: