1. ArrayList 中间增删 O (n),LinkedList 增删 O (1)
  2. LinkedList 需额外存储节点引用,内存开销更大

记忆口诀:数组查快增删慢,链表增删查慢


问:ArrayList 和 LinkedList 分别适用于什么场景?

答:

  1. ArrayList 适用于频繁查询、遍历的场景
  2. LinkedList 适用于频繁增删、头尾操作的场景
  3. ArrayList 适合数据量稳定、内存连续的场景
  4. LinkedList 适合队列、栈等结构的实现

记忆口诀:查多用数组,增删用链表


问:ArrayList 的扩容机制是什么?

答:

  1. 默认初始容量为 10,元素满后自动扩容
  2. 每次扩容为原容量的 1.5 倍
  3. 扩容时会创建新数组,复制原数组元素
  4. 可通过构造方法指定初始容量避免频繁扩容

记忆口诀:初始十,扩一点五倍

问:ArrayList 的扩容机制了解吗?

答:

  1. 插入元素前先检查容量,不足则触发扩容
  2. 默认初始容量为 10,扩容为原容量的 1.5 倍
  3. 扩容时创建新数组,复制原数组所有元素
  4. 可指定初始容量,避免频繁扩容开销

记忆口诀:初始十,扩一点五倍


问:ArrayList 扩容的核心源码逻辑是什么?

答:

  1. add 方法调用 ensureCapacityInternal 检查容量
  2. 空数组首次扩容,容量设为 10
  3. 容量不足时调用 grow 方法执行扩容
  4. grow 方法创建 1.5 倍新数组,复制元素

记忆口诀:检查容量,扩容复制


问:如何优化 ArrayList 的扩容性能?

答:

  1. 预估元素数量,构造时指定初始容量
  2. 批量添加元素前调用 ensureCapacity
  3. 避免频繁扩容导致的数组复制开销
  4. 大数量场景下,减少扩容次数

记忆口诀:预指定容量,减少扩容

问:ArrayList 中为什么用 transient 修饰数组?

答:

  1. 避免序列化数组中未使用的空闲空间
  2. 提升序列化性能,减少序列化数据量
  3. 隐藏内部实现细节,保证封装性
  4. 通过自定义方法序列化有效元素

记忆口诀:transient 控序列化,省空间提性能


问:ArrayList 如何实现自定义序列化?

答:

  1. 重写 writeObject 方法,写入 size 和有效元素
  2. 重写 readObject 方法,读取 size 和元素重建数组
  3. 仅序列化实际存储的元素,不序列化空数组
  4. 保证序列化后数组容量与元素数量一致

记忆口诀:自定义读写,只序列化有效元素


问:transient 关键字的作用是什么?

答:

  1. 修饰的变量不会被默认序列化机制序列化
  2. 用于控制序列化过程,保护敏感数据
  3. 可通过自定义方法实现手动序列化
  4. 不影响对象的正常创建与使用

记忆口诀:transient 修饰,默认不序列化

问:什么是快速失败 (fail-fast) 和安全失败 (fail-safe)?

答:

  1. 快速失败:迭代中修改集合,立即抛并发异常
  2. 安全失败:迭代基于集合快照,修改不抛异常
  3. 快速失败是 ArrayList、HashMap 等非并发集合策略
  4. 安全失败是 CopyOnWriteArrayList 等并发集合策略

记忆口诀:快失败抛异常,安全失败用快照


问:快速失败的实现原理是什么?

答:

  1. 集合维护 modCount,记录修改次数
  2. 迭代器创建时记录 expectedModCount
  3. 每次迭代检查 modCount 与 expectedModCount
  4. 不一致则抛出 ConcurrentModificationException

记忆口诀:modCount 校验,不一致抛异常


问:快速失败和安全失败的适用场景?

答:

  1. 快速失败:单线程迭代,需尽早发现并发问题
  2. 安全失败:多线程并发迭代,允许数据弱一致
  3. 快速失败性能高,安全失败有额外内存开销
  4. 非并发集合用快速失败,并发集合用安全失败

记忆口诀:单线程快失败,多线程安全失败

问:怎么保证 ArrayList 线程安全?

答:

  1. 使用 Collections.synchronizedList 包装 ArrayList
  2. 使用 CopyOnWriteArrayList 替代 ArrayList
  3. 使用 Vector 等原生线程安全列表类
  4. 手动加 synchronized 锁或自定义同步机制

记忆口诀:包装、替代、加锁,保证线程安全


问:CopyOnWriteArrayList 的实现原理是什么?

答:

  1. 写操作时复制底层数组,在新数组修改
  2. 修改完成后将引用指向新数组,无锁实现
  3. 读操作直接访问原数组,读写分离
  4. 适合读多写少的高并发场景

记忆口诀:写时复制,读写分离


问:Collections.synchronizedList 和 CopyOnWriteArrayList 的区别?

答:

  1. synchronizedList 加锁实现,读写互斥
  2. CopyOnWriteArrayList 写时复制,读写不互斥
  3. synchronizedList 写性能高,CopyOnWriteArrayList 读性能高
  4. CopyOnWriteArrayList 适合读多写少,synchronizedList 通用

记忆口诀:synchronized 加锁,CopyOnWrite 写时复制

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐