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

Kotlin嵌套列表实例化默认含空元素的原因与规避方法

问题原因

你遇到的这个现象是因为mutableListOf()的构造函数重载逻辑:

  • 示例1中mutableListOf<String>()调用的是无参构造函数,初始化出一个空列表,后续add两个元素后长度为2,符合预期。
  • 示例2中mutableListOf(mutableListOf<String>())调用的是接受可变数量元素的构造函数,你把那个空的子列表作为第一个元素直接传入了外层列表,所以初始化完成后,外层列表已经包含1个空的子列表。之后你又add了2个子列表,总长度自然是1+2=3。
优雅的规避方式

1. 从初始化阶段直接避免(推荐)

调用无参的mutableListOf,明确指定外层列表的泛型类型,这样初始化出来的就是空的外层列表:

val testList2 = mutableListOf<MutableList<String>>()

testList2.add(mutableListOf("sf", "fgs"))
testList2.add(mutableListOf("sw", "fgg"))

Toast.makeText(this, testList2.size.toString(), Toast.LENGTH_SHORT).show() // 显示长度为2

这种方式从根源解决问题,不需要后续清理操作,是最简洁合理的写法。

2. 若需初始化时传入非空初始子列表

如果业务场景需要外层列表一开始就包含某些非空的子列表,直接传入这些非空列表即可,不要传入空列表作为初始元素:

// 初始化时传入一个非空子列表,后续add两个,总长度为3(符合预期)
val testList2 = mutableListOf(mutableListOf("initial", "item"))
testList2.add(mutableListOf("sf", "fgs"))
testList2.add(mutableListOf("sw", "fgg"))

3. 已存在初始空列表时的清理(仅作补充,不推荐)

如果已经写出了带初始空列表的代码,除了removeIf,还可以用更简洁的removeAll,但这种方式属于事后补救,不如从初始化阶段避免:

testList2.removeAll { it.isEmpty() }

内容的提问来源于stack exchange,提问作者Kratos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:16:05