You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:15:09