面试题答案
一键面试设计思路
- 预估元素数量:在特定场景下,由于已知会有大量元素在短时间内频繁添加,可提前获取或预估要添加的元素大致数量。例如,可以通过调用方传递一个预估值,或者在程序运行初期通过某种统计机制获取。
- 初始容量设置:基于预估数量,设置一个合适的初始容量。如果预估数量为
n
,可以将初始容量设置为n
或者n
略大的值,以减少初始阶段的扩容次数。 - 扩容因子调整:原ArrayList的扩容因子为0.75,对于该场景可以适当增大扩容因子,比如设置为0.9。这样可以减少扩容频率,因为只有当数组占用空间达到90%时才进行扩容。
- 扩容方式优化:当需要扩容时,不再是简单地扩容为原容量的1.5倍。可以采用更加激进的扩容策略,例如扩容为原容量的2倍。这样虽然可能会浪费一些空间,但能大幅减少扩容次数,提升频繁添加元素时的性能。
复杂度分析
- 空间复杂度:
- 原策略:在扩容过程中,由于扩容因子为0.75,且每次扩容为原容量的1.5倍,空间增长相对较为平缓,整体空间复杂度在扩容过程中为O(n)。但由于扩容次数相对较多,可能会导致一些短期的空间浪费。
- 新策略:由于初始容量可能设置得较大,且扩容倍数为2倍,可能会在开始阶段和扩容时浪费更多空间。但从整体频繁添加元素的场景来看,减少了扩容次数,长期空间复杂度仍为O(n),不过在某些阶段空间占用可能比原策略大。
- 时间复杂度:
- 原策略:每次扩容时需要将原数组的元素复制到新数组,扩容次数较多,每次复制操作的时间复杂度为O(n),频繁添加元素时,总的时间复杂度受扩容次数影响,会相对较高。
- 新策略:由于初始容量设置合理且扩容倍数增大,扩容次数大幅减少。虽然每次扩容复制元素的时间复杂度仍为O(n),但总体的时间复杂度在频繁添加元素场景下会降低,优于原策略。