ArrayList初始化应选对构造方式、用好泛型、避免懒加载扩容开销:1.无参构造适用于小数据或规模未知,首次add才创建长度10数组;2.指定初始容量(如new ArrayList(50))可避免多次扩容;3.传入集合初始化需确保源集合非null且用泛型声明。

ArrayList 的初始化和创建方式直接关系到后续操作的效率和安全性,关键在于选对构造方式、用好泛型、避开默认懒加载带来的首次扩容开销。
三种标准构造方式及适用场景
ArrayList 提供三个公开构造方法,对应不同初始化需求:
- 无参构造(推荐用于小数据或不确定规模):JDK 1.8+ 采用懒加载,不立即分配数组,首次 add 时才创建长度为 10 的 Object[]。适合元素数量极少或无法预估的情况。
-
指定初始容量(推荐用于已知大致规模):如
new ArrayList(50),直接分配 50 元素的数组。避免前几十次 add 触发多次扩容(每次扩容需复制数组),提升批量写入性能。 -
传入集合初始化(适合已有数据源):如
new ArrayList(Arrays.asList("a", "b", "c"))。内部调用c.toArray(),并确保底层数组类型为Object[],size 精确设为源集合大小。
必须搭配泛型声明
无论哪种构造方式,都应显式使用泛型,例如 ArrayList<string></string> 或 List<integer></integer>。这能避免运行时 ClassCastException,让编译器在编码阶段捕获类型错误。不写泛型(如 new ArrayList())属于原始类型用法,已不被现代开发规范推荐。
初始化时的常见误区
注意几个易错点:
- 初始容量设为 0 是合法的(
new ArrayList(0)),此时底层数组为共享的空数组EMPTY_ELEMENTDATA,第一次 add 仍会扩容到 10; - 传入
null集合作为参数会抛出NullPointerException; - 不要误用
Arrays.asList(...)返回值本身当作 ArrayList——它返回的是固定大小的 List 实现,不支持 add/remove;必须用它作为构造参数再包一层。
简单实用的初始化写法示例
日常开发中,这几行足够清晰高效:
- 空列表起步:
List<string> list = new ArrayList();</string> - 预估 100 条记录:
ArrayList<order> orders = new ArrayList(100);</order> - 带初始值:
List<integer> nums = new ArrayList(Arrays.asList(1, 2, 3));</integer>


















