ArrayList预扩容后尾部插入100万数据最快(10–30ms)、内存最低(约4MB);LinkedList插入虽O(1)但耗时50–120ms、内存翻倍;HashSet/TreeSet侧重去重排序,耗时更长;CopyOnWriteArrayList等并发集合因机制限制极慢。

插入100万条数据时,不同集合类型的性能差异主要体现在底层实现上:ArrayList基于动态数组,插入尾部极快但中间插入慢;LinkedList基于双向链表,任意位置插入理论上O(1),但实际受对象创建和引用开销影响;HashSet/TreeSet依赖哈希表或红黑树,插入侧重去重与排序,而非位置;而CopyOnWriteArrayList等并发集合则因写时复制机制显著拖慢插入速度。
ArrayList:尾部插入最快,内存占用最低
在未指定初始容量时,ArrayList会频繁扩容(默认1.5倍),触发多次数组拷贝,耗时上升。若提前设置 new ArrayList(1_000_000),插入100万元素(尾部)通常在 10–30ms 内完成,内存占用约 ~4MB(仅存储对象引用,假设每个元素为Integer,JVM中引用占4–8字节,取决于是否开启CompressedOops)。
LinkedList:插入快但内存开销大
LinkedList在头部或尾部插入均为O(1),100万次add()约耗时 50–120ms,明显慢于预扩容的ArrayList。原因在于每次插入需新建Node对象(含prev、next、item三个引用),内存占用翻倍——除100万个元素外,还额外分配约 2.4MB–4.8MB 的节点对象空间(64位JVM下每个Node至少24字节对象头+24字节字段)。
HashSet 与 TreeSet:插入即去重/排序,速度较慢
HashSet 插入100万个唯一整数,平均耗时约 80–200ms,内存占用约 12–16MB(哈希表负载因子0.75,需约133万桶位,加上Node对象开销)。若数据含大量哈希冲突(如全为相同hashCode),性能可能骤降至秒级。
TreeSet 基于红黑树,每次插入需O(log n)比较与平衡操作,100万次插入通常需 300–800ms,内存略高于HashSet(每个节点含颜色、左右子节点等字段),且对元素类型有Comparable要求。
其他集合需谨慎评估场景
- CopyOnWriteArrayList:插入100万次将触发百万级数组复制,耗时可达数秒至数十秒,仅适用于读多写极少场景。
- Vector:同步开销使其比ArrayList慢2–3倍,不推荐用于大批量插入。
- LinkedHashSet:兼具HashSet查找效率与插入顺序,耗时与内存介于HashSet和LinkedList之间,适合需去重且保持顺序的场景。
真实耗时受JVM参数(如堆大小、GC策略)、硬件(CPU缓存、内存带宽)、数据特征(是否重复、是否有序)影响较大。建议压测时使用JMH,并禁用预热外的干扰(如System.gc()调用、后台线程)。单纯比拼“插入100万”,ArrayList(预扩容)仍是通用场景下的最优解。

















