Kotlin如何创建含n个元素的ArrayList?初始容量构造器越界如何解决?
核心原因:初始容量和列表长度是完全独立的两个属性
ArrayList构造方法传入的initialCapacity仅作用于底层存储数据的数组:提前申请对应大小的内存空间,降低后续新增元素时频繁扩容的性能开销,不会修改列表的初始size,新创建的ArrayList默认size固定为0。- 下标赋值语法
test[3] = 5本质是调用set方法,该方法的校验逻辑要求目标下标必须落在[0, size - 1]区间内,只要下标超过当前size就会抛出越界异常,这是JVM平台ArrayList的统一设计,和Kotlin、Android Studio版本没有关系。 - 你观察到
add方法可以正常使用的原因是:add会把元素追加到列表末尾,同时将size数值加1,不会触发下标范围校验。
对应场景的解决方案
场景1:需要支持直接按下标赋值,初始化时就固定列表长度
使用MutableList构造方法直接指定长度和默认填充值即可:
class ArrayListTest : TestCase() { @Test fun testArrayList() { // 初始化长度为12,所有元素默认值为0的可变列表 val test = MutableList(12) { 0 } test[3] = 5 // 运行正常 } }
场景2:仅需要降低后续扩容开销,不需要提前占用固定长度的元素位
可以继续使用ArrayList(12)的写法,只需要保证赋值前目标下标对应的位置已经通过add方法添加过元素即可:
val test = ArrayList<Int>(12) // 先添加4个元素,此时size为4,支持的下标范围是0~3 repeat(4) { test.add(0) } test[3] = 5 // 运行正常
补充说明
官方文档提到的「容量控制功能有限」指的是:就算你指定了初始容量,后续如果添加的元素总数超过初始容量,底层数组还是会自动扩容,不会限制列表的最大元素数量,和你遇到的越界问题属于完全不同的逻辑。
内容的提问来源于stack exchange,提问作者Craig Graham
相关产品推荐
相关产品推荐

