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

Kotlin:如何实现mutableListOf()?自定义动态List方法探讨

不用mutableListOf()实现自定义动态List的方案

当然可以。Kotlin虽然没有C++那样的直接指针,但可以借鉴Java ArrayList的底层实现逻辑——用固定容量的数组作为底层存储,手动管理容量扩容、元素增删和索引映射,完全不需要依赖mutableListOf()。

核心逻辑是:

  • 用一个私有数组存储元素,初始设定一个默认容量(比如10)
  • 维护一个size变量记录当前实际存储的元素数量(和数组容量区分开)
  • 当添加元素导致size超过数组容量时,创建一个更大的新数组,把旧数组的元素复制过去
  • 删除元素时,将目标索引后的元素向前移动一位,同时减少size

下面是一个极简的实现示例:

class SimpleMutableList<T> {
    // 底层存储数组,初始容量10
    private var elements: Array<Any?> = arrayOfNulls(10)
    // 当前实际元素数量
    private var currentSize = 0

    // 添加元素
    fun add(element: T) {
        // 检查是否需要扩容
        if (currentSize == elements.size) {
            // 扩容为原容量的1.5倍,也可以用2倍,根据需求调整
            val newCapacity = elements.size * 3 / 2
            val newElements = arrayOfNulls<Any?>(newCapacity)
            // 复制旧数组元素到新数组
            System.arraycopy(elements, 0, newElements, 0, elements.size)
            elements = newElements
        }
        elements[currentSize++] = element
    }

    // 获取指定索引的元素
    fun get(index: Int): T {
        // 索引合法性检查
        if (index < 0 || index >= currentSize) {
            throw IndexOutOfBoundsException("Index $index out of bounds for size $currentSize")
        }
        @Suppress("UNCHECKED_CAST")
        return elements[index] as T
    }

    // 删除指定索引的元素
    fun remove(index: Int): T {
        if (index < 0 || index >= currentSize) {
            throw IndexOutOfBoundsException("Index $index out of bounds for size $currentSize")
        }
        @Suppress("UNCHECKED_CAST")
        val removedElement = elements[index] as T
        // 将索引后的元素向前移动一位
        val numMoved = currentSize - index - 1
        if (numMoved > 0) {
            System.arraycopy(elements, index + 1, elements, index, numMoved)
        }
        // 清空最后一个位置的引用,帮助GC
        elements[--currentSize] = null
        return removedElement
    }

    // 获取当前元素数量
    fun size(): Int = currentSize

    // 判断是否为空
    fun isEmpty(): Boolean = currentSize == 0
}

关键细节说明:

  1. 数组扩容:这里用了1.5倍的扩容系数,平衡内存占用和扩容频率(如果用2倍,扩容次数少但可能浪费更多内存)。
  2. 类型转换:因为Kotlin不支持直接创建泛型数组,所以用Array<Any?>存储,获取元素时强转为泛型T,用@Suppress("UNCHECKED_CAST")抑制警告。
  3. 内存优化:删除元素后把最后一个位置设为null,避免无用对象占用内存,帮助垃圾回收。

其实mutableListOf()默认返回的就是ArrayList实例,它的底层逻辑和上面的实现几乎一致——Kotlin只是把这些细节封装好了,手动实现一遍就能彻底理解动态List的工作原理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:46:17