鹿泉专业网站建设,上海公司排名大全,微信被不明android账号登录,拼多多网页设计尺寸前言
上次面试时#xff0c;手写ArrayList竟然翻车#xff0c;忘了里面的扩容与缩容的条件#xff0c;再次实现一次#xff0c;加深印象
源码讲了什么
实现了List列表和RandomAccess随机访问接口List具有增删改查功能#xff0c;RandomAccess支持下标访问内部是一个扩容…前言
上次面试时手写ArrayList竟然翻车忘了里面的扩容与缩容的条件再次实现一次加深印象
源码讲了什么
实现了List列表和RandomAccess随机访问接口List具有增删改查功能RandomAccess支持下标访问内部是一个扩容数组默认大小是10sizesizesize/2
如何实现
实现List的addremovesetget实现RandomAccess的下标访问实现集合的基本sizeisEmptytoString实现扩容grow每一增到1.5倍sizesizesize/2缩容方法需要手动调用内部不会再remove自动调用使数组容量等于当前元素个数arrayArray(size)size元素个数array.size时容量
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个每次扩容sizesizesize2private 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] valuesizereturn true}// 删除按值按下标删除已经废弃了fun remove(value: Int): Boolean {var index -1for (i in 0 until size) {if (array[i] value) {index ibreak}}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] valuereturn true}// 查fun get(index: Int) if (index !in 0 until size) -1 else array[index]// toStringoverride fun toString() StringBuilder().apply {append([)for (i in 0 until size) {append(if (i 0) array[i] else , ${array[i]})}append(])}.toString()// 扩容添加大量元素时会使用minCapacityprivate fun grow(minCapacity: Int) {var newCapacity Math.max(minCapacity, array.size array.size / 2)val newArray ArrayInt(newCapacity) { 0 }for (i in 0 until size) {newArray[i] array[i]}array newArray}// 缩容方法不用不写// 用来判断的emptyfun isEmpty() size 0fun isNotEmpty() size 0fun size() size
}