Kotllin实现ArrayList的基本功能

前言

上次面试时,手写ArrayList竟然翻车,忘了里面的扩容与缩容的条件,再次实现一次,加深印象

源码讲了什么

  1. 实现了List列表和RandomAccess随机访问接口
  2. List具有增删改查功能,RandomAccess支持下标访问
  3. 内部是一个扩容数组,默认大小是10,size=size+size/2

如何实现

  1. 实现List的add,remove,set,get
  2. 实现RandomAccess的下标访问
  3. 实现集合的基本size,isEmpty,toString
  4. 实现扩容grow,每一增到1.5倍,size=size+size/2
  5. 缩容方法需要手动调用(内部不会再remove自动调用),使数组容量等于当前元素个数,array=Array(size),size元素个数,array.size时容量
kotlin 复制代码
fun main() {
    val list = MyArrayList()
    list.add(1)
    list.add(2)
    list.add(3)
    list.add(0, 2)
    list.set(list.size(), 7)
    println(list)
}

class MyArrayList {
    // 方便扩展,默认是10个,每次扩容size=size+size>>2
    private var array = Array(10) { 0 }

    // 当前大小
    private var size = 0

    // 添加
    fun add(value: Int) {
        if (size >= array.size) {
            grow(size + 1)
        }
        array[size++] = value
    }

    // 中间插入,按下标
    fun add(index: Int, value: Int): Boolean {
        if (size !in 0..size) {
            return false
        }
        if (size >= array.size) {
            grow(size + 1)
        }
        for (i in size downTo index + 1) {
            array[i] = array[i - 1]
        }
        array[index] = value
        size++
        return true
    }

    // 删除,按值,按下标删除已经废弃了
    fun remove(value: Int): Boolean {
        var index = -1
        for (i in 0 until size) {
            if (array[i] == value) {
                index = i
                break
            }
        }
        if (index == -1) {
            return false
        }
        for (i in index + 1 until size) {
            array[i - 1] = array[i]
        }
        size--
        return true
    }

    // 改
    fun set(index: Int, value: Int): Boolean {
        if (index !in 0 until size) {
            return false
        }
        array[index] = value
        return true
    }

    // 查
    fun get(index: Int) = if (index !in 0 until size) -1 else array[index]

    // toString
    override fun toString() = StringBuilder().apply {
        append("[")
        for (i in 0 until size) {
            append(if (i == 0) array[i] else ", ${array[i]}")
        }
        append("]")
    }.toString()

    // 扩容,添加大量元素时会使用minCapacity
    private fun grow(minCapacity: Int) {
        var newCapacity = Math.max(minCapacity, array.size + array.size / 2)
        val newArray = Array<Int>(newCapacity) { 0 }
        for (i in 0 until size) {
            newArray[i] = array[i]
        }
        array = newArray
    }

    // 缩容方法不用,不写

    // 用来判断的empty
    fun isEmpty() = size == 0

    fun isNotEmpty() = size > 0

    fun size() = size
}
相关推荐
Escalating_xu8 分钟前
【Linux】基础 I/O 深度解析:FILE、文件描述符、open/read/write、重定向与缓冲区
java·linux·服务器
城管不管11 分钟前
MySQL 慢查询完整排查
java·服务器·jvm·数据库·mysql·spring·面试
ZC跨境爬虫23 分钟前
LeetCode 88. 合并两个有序数组(双指针详解 + Java Python 实现)
java·python·算法·leetcode
Nil20826 分钟前
leetcode 238除了自身以外数组的乘积
数据结构·算法·leetcode
土司大王26 分钟前
LeetCode hot100——最长连续序列
数据结构·算法·leetcode
北风toto34 分钟前
研发效能与后端核心技术全景指南:从CI/CD到共性组件实战
java·开发语言·ci/cd
01二进制代码漫游日记38 分钟前
C++基础入门速通
java·开发语言·c++
Herbert_hwt39 分钟前
第六章 Java深入理解接口、函数式接口与lambda表达式
java·开发语言·算法
API快乐传递者1 小时前
电商竞品分析接口实战指南:从数据采集到决策洞察的全链路方案
java·python
程序员黑豆8 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程