面试题答案
一键面试ArrayList的扩容机制
- 初始容量:当创建一个ArrayList对象时,如果没有指定初始容量,默认容量为10。例如
ArrayList<Integer> list = new ArrayList<>();
,此时其内部数组的初始容量为10。 - 容量检查与扩容:当向ArrayList中添加元素时,会先检查当前元素个数是否达到了数组的容量。如果达到了,就会进行扩容。扩容时,新的容量是原来容量的1.5倍(
int newCapacity = oldCapacity + (oldCapacity >> 1);
,即原容量加上原容量的一半)。然后会创建一个新的数组,其容量为新计算的容量,并将原数组的内容复制到新数组中。例如,当原容量为10,添加第11个元素时,新容量变为15(10 + 10/2),并创建新数组进行数据复制。 - 添加大量元素时:如果在短时间内需要添加大量元素,频繁的扩容操作会导致性能开销,因为每次扩容都涉及到数组的复制。
通过设置初始容量优化性能
- 场景:如果事先知道大概需要存储的元素数量,可以在创建ArrayList时指定初始容量。例如,预计要存储100个元素,
ArrayList<Integer> list = new ArrayList<>(100);
。 - 好处:这样可以避免在添加元素过程中频繁扩容,减少数组复制的开销,从而提高性能。因为直接创建了足够大的内部数组,不需要多次创建新数组和复制数据。