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.5倍的扩容系数,平衡内存占用和扩容频率(如果用2倍,扩容次数少但可能浪费更多内存)。
- 类型转换:因为Kotlin不支持直接创建泛型数组,所以用
Array<Any?>存储,获取元素时强转为泛型T,用@Suppress("UNCHECKED_CAST")抑制警告。 - 内存优化:删除元素后把最后一个位置设为null,避免无用对象占用内存,帮助垃圾回收。
其实mutableListOf()默认返回的就是ArrayList实例,它的底层逻辑和上面的实现几乎一致——Kotlin只是把这些细节封装好了,手动实现一遍就能彻底理解动态List的工作原理。
内容的提问来源于stack exchange,提问作者CarlosSebatian13
相关产品推荐
相关产品推荐

