ARTICLE · 1130636
第027篇 ArrayList 源码与扩容机制
第027篇 ArrayList 源码与扩容机制
ArrayList 这题,面试张口就是“底层数组查询快”,但无参构造 new 出来的那一刻,底层数组多大?台面上的人一半会答错。
JDK 8 里它不会立刻分配,首次 add 之前底层是空数组,第一次 add 才真正扩容到默认容量 10。后续每次不够,新容量就取旧容量的 1.5 倍,通过 Arrays.copyOf 整体拷贝过去。
坑就在这儿。要是预知数据量还用无参构造,比如循环 add 一万条数据,就会经历多次扩容和整段拷贝,既吃 CPU 又加重 GC。正确做法是构造时直接指定容量,一次到位。
还有个更隐蔽的坑:用 subList 拿到的是原集合的视图。对子列表的增删会直接反映到原集合,把结果当独立列表传出去,很容易在生产环境炸出异常。
另外,多线程并发 add 也会出问题,size 自增和数组写入不是原子的,会导致元素覆盖甚至越界。这玩意儿从设计上就不保证并发安全。
原文第027篇 ArrayList 源码与扩容机制:1.5 倍增长的细节
广东,15小时前,