Java高频面试考点:ArrayList与LinkedList比较
·
- ArrayList 中间增删 O (n),LinkedList 增删 O (1)
- LinkedList 需额外存储节点引用,内存开销更大
记忆口诀:数组查快增删慢,链表增删查慢
问:ArrayList 和 LinkedList 分别适用于什么场景?
答:
- ArrayList 适用于频繁查询、遍历的场景
- LinkedList 适用于频繁增删、头尾操作的场景
- ArrayList 适合数据量稳定、内存连续的场景
- LinkedList 适合队列、栈等结构的实现
记忆口诀:查多用数组,增删用链表
问:ArrayList 的扩容机制是什么?
答:
- 默认初始容量为 10,元素满后自动扩容
- 每次扩容为原容量的 1.5 倍
- 扩容时会创建新数组,复制原数组元素
- 可通过构造方法指定初始容量避免频繁扩容
记忆口诀:初始十,扩一点五倍
问:ArrayList 的扩容机制了解吗?
答:
- 插入元素前先检查容量,不足则触发扩容
- 默认初始容量为 10,扩容为原容量的 1.5 倍
- 扩容时创建新数组,复制原数组所有元素
- 可指定初始容量,避免频繁扩容开销
记忆口诀:初始十,扩一点五倍
问:ArrayList 扩容的核心源码逻辑是什么?
答:
- add 方法调用 ensureCapacityInternal 检查容量
- 空数组首次扩容,容量设为 10
- 容量不足时调用 grow 方法执行扩容
- grow 方法创建 1.5 倍新数组,复制元素
记忆口诀:检查容量,扩容复制
问:如何优化 ArrayList 的扩容性能?
答:
- 预估元素数量,构造时指定初始容量
- 批量添加元素前调用 ensureCapacity
- 避免频繁扩容导致的数组复制开销
- 大数量场景下,减少扩容次数
记忆口诀:预指定容量,减少扩容
问:ArrayList 中为什么用 transient 修饰数组?
答:
- 避免序列化数组中未使用的空闲空间
- 提升序列化性能,减少序列化数据量
- 隐藏内部实现细节,保证封装性
- 通过自定义方法序列化有效元素
记忆口诀:transient 控序列化,省空间提性能
问:ArrayList 如何实现自定义序列化?
答:
- 重写 writeObject 方法,写入 size 和有效元素
- 重写 readObject 方法,读取 size 和元素重建数组
- 仅序列化实际存储的元素,不序列化空数组
- 保证序列化后数组容量与元素数量一致
记忆口诀:自定义读写,只序列化有效元素
问:transient 关键字的作用是什么?
答:
- 修饰的变量不会被默认序列化机制序列化
- 用于控制序列化过程,保护敏感数据
- 可通过自定义方法实现手动序列化
- 不影响对象的正常创建与使用
记忆口诀:transient 修饰,默认不序列化
问:什么是快速失败 (fail-fast) 和安全失败 (fail-safe)?
答:
- 快速失败:迭代中修改集合,立即抛并发异常
- 安全失败:迭代基于集合快照,修改不抛异常
- 快速失败是 ArrayList、HashMap 等非并发集合策略
- 安全失败是 CopyOnWriteArrayList 等并发集合策略
记忆口诀:快失败抛异常,安全失败用快照
问:快速失败的实现原理是什么?
答:
- 集合维护 modCount,记录修改次数
- 迭代器创建时记录 expectedModCount
- 每次迭代检查 modCount 与 expectedModCount
- 不一致则抛出 ConcurrentModificationException
记忆口诀:modCount 校验,不一致抛异常
问:快速失败和安全失败的适用场景?
答:
- 快速失败:单线程迭代,需尽早发现并发问题
- 安全失败:多线程并发迭代,允许数据弱一致
- 快速失败性能高,安全失败有额外内存开销
- 非并发集合用快速失败,并发集合用安全失败
记忆口诀:单线程快失败,多线程安全失败
问:怎么保证 ArrayList 线程安全?
答:
- 使用 Collections.synchronizedList 包装 ArrayList
- 使用 CopyOnWriteArrayList 替代 ArrayList
- 使用 Vector 等原生线程安全列表类
- 手动加 synchronized 锁或自定义同步机制
记忆口诀:包装、替代、加锁,保证线程安全
问:CopyOnWriteArrayList 的实现原理是什么?
答:
- 写操作时复制底层数组,在新数组修改
- 修改完成后将引用指向新数组,无锁实现
- 读操作直接访问原数组,读写分离
- 适合读多写少的高并发场景
记忆口诀:写时复制,读写分离
问:Collections.synchronizedList 和 CopyOnWriteArrayList 的区别?
答:
- synchronizedList 加锁实现,读写互斥
- CopyOnWriteArrayList 写时复制,读写不互斥
- synchronizedList 写性能高,CopyOnWriteArrayList 读性能高
- CopyOnWriteArrayList 适合读多写少,synchronizedList 通用
记忆口诀:synchronized 加锁,CopyOnWrite 写时复制
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)