Scala ArrayBuffer的append操作是否始终在末尾添加元素?
Scala ArrayBuffer 核心行为明确
新元素添加位置的确定性
不管ArrayBuffer是否因为容量耗尽触发数组重新分配,或是之前删除操作留下了空槽,使用+=添加新元素时,一定会追加到当前所有有效元素的末尾。
ArrayBuffer内部靠两个核心属性维护状态:一是存储数据的底层数组,二是记录有效元素数量的length值。添加元素时:
- 若底层数组还有剩余空间,直接把元素放到
length对应的索引位置,再把length加1; - 若空间不足,会重新分配一个更大的新数组(通常为原容量的1.5-2倍),把原数组里的有效元素全部复制过去,再将新元素追加到新数组的末尾,最后更新底层数组引用和
length。
哪怕之前执行过-=这类删除操作,底层数组里有空槽,但length会精准标记有效元素的结束位置,新元素始终落在这个位置之后,也就是有效元素的末尾。
删除操作后的数组压缩逻辑
执行-=删除元素后,底层数组不会立刻被压缩。这是ArrayBuffer为了减少频繁数组复制、提升性能的设计:
- 删除元素时,会找到目标元素的索引,将该索引之后的所有有效元素向前移动一位,然后把
length减1; - 底层数组的总容量(
capacity)保持不变,空出来的槽位会被保留,后续添加元素时可以直接复用,不需要马上扩容。
只有主动调用trimToSize()方法,ArrayBuffer才会创建一个容量等于当前length的新数组,把有效元素复制进去,完成数组压缩。
内容的提问来源于stack exchange,提问作者Ged
相关产品推荐
相关产品推荐

