当前位置: 首页 > wzjs >正文

网站建站 在线制作如何自己做网站腾讯

网站建站 在线制作,如何自己做网站腾讯,成都十八个网红打卡地,上海网站制作衫在Kotlin开发中,MutableList是我们常用的集合类型之一。但当我们需要在遍历列表的同时修改它(添加或删除元素)时,很多开发者会遇到ConcurrentModificationException异常。本文将详细介绍如何安全高效地实现这一需求。 一、问题场…

在Kotlin开发中,MutableList是我们常用的集合类型之一。但当我们需要在遍历列表的同时修改它(添加或删除元素)时,很多开发者会遇到ConcurrentModificationException异常。本文将详细介绍如何安全高效地实现这一需求。

一、问题场景再现

1. 典型异常案例

fun main() {val list = mutableListOf("苹果", "香蕉", "橙子")// 尝试在遍历时删除元素 - 会抛出ConcurrentModificationExceptionfor (fruit in list) {if (fruit == "香蕉") {list.remove(fruit) // 这里会抛出异常}}// 尝试在遍历时添加元素 - 同样会抛出异常for (fruit in list) {if (fruit == "橙子") {list.add("西瓜") // 这里会抛出异常}}
}

二、解决方案大全

1. 删除元素的正确方式

方法1:使用iterator.remove()
fun safeRemoveWithIterator() {val list = mutableListOf("苹果", "香蕉", "橙子")val iterator = list.iterator()while (iterator.hasNext()) {val fruit = iterator.next()if (fruit == "香蕉") {iterator.remove() // 安全删除当前元素}}println(list) // 输出: [苹果, 橙子]
}
方法2:使用removeAll函数
fun safeRemoveWithRemoveAll() {val list = mutableListOf("苹果", "香蕉", "橙子")// 移除所有等于"香蕉"的元素list.removeAll { it == "香蕉" }println(list) // 输出: [苹果, 橙子]
}
方法3:反向遍历删除
fun safeRemoveWithReverseTraversal() {val list = mutableListOf("苹果", "香蕉", "橙子")for (i in list.indices.reversed()) {if (list[i] == "香蕉") {list.removeAt(i) // 根据索引安全删除}}println(list) // 输出: [苹果, 橙子]
}

2. 添加元素的正确方式

方法1:使用listIterator.add()
fun safeAddWithListIterator() {val list = mutableListOf("苹果", "香蕉", "橙子")val iterator = list.listIterator()while (iterator.hasNext()) {val fruit = iterator.next()if (fruit == "香蕉") {iterator.add("西瓜") // 在当前元素后添加}}println(list) // 输出: [苹果, 香蕉, 西瓜, 橙子]
}
方法2:先收集再添加
fun safeAddWithCollectFirst() {val list = mutableListOf("苹果", "香蕉", "橙子")val elementsToAdd = mutableListOf<String>()for (fruit in list) {if (fruit == "香蕉") {elementsToAdd.add("西瓜")elementsToAdd.add("葡萄")}}list.addAll(elementsToAdd)println(list) // 输出: [苹果, 香蕉, 橙子, 西瓜, 葡萄]
}
方法3:使用索引遍历添加
fun safeAddWithIndex() {val list = mutableListOf("苹果", "香蕉", "橙子")var i = 0while (i < list.size) {val fruit = list[i]if (fruit == "香蕉") {list.add(i + 1, "西瓜") // 在香蕉后面添加西瓜i++ // 跳过新增的元素}i++}println(list) // 输出: [苹果, 香蕉, 西瓜, 橙子]
}

三、多线程环境下的安全操作

1. 使用CopyOnWriteArrayList

import java.util.concurrent.CopyOnWriteArrayListfun threadSafeWithCopyOnWrite() {val list = CopyOnWriteArrayList<String>().apply {addAll(listOf("苹果", "香蕉", "橙子"))}// 线程1:遍历列表Thread {for (fruit in list) {println("线程1读取: $fruit")Thread.sleep(100)}}.start()// 线程2:修改列表Thread {Thread.sleep(50)list.add("西瓜")list.remove("香蕉")}.start()Thread.sleep(300)println("最终结果: $list")
}

2. 使用同步块

fun threadSafeWithSynchronized() {val list = mutableListOf("苹果", "香蕉", "橙子")val lock = Any()// 线程1Thread {synchronized(lock) {for (fruit in list) {println("线程1读取: $fruit")Thread.sleep(100)}}}.start()// 线程2Thread {synchronized(lock) {Thread.sleep(50)list.add("西瓜")list.remove("香蕉")}}.start()Thread.sleep(300)println("最终结果: $list")
}

四、性能比较与最佳实践

1. 各种方法性能对比

方法时间复杂度适用场景
iterator.remove()O(n)简单删除少量元素
removeAllO(n)条件删除多个元素
反向遍历O(n)需要索引操作的删除
listIterator.add()O(n)在特定位置插入元素
先收集再添加O(n+m)需要添加多个元素
CopyOnWriteArrayListO(n)读, O(n)写读多写少的并发场景

2. 最佳实践建议

  1. 单线程环境

    • 优先使用标准库函数如removeAllfilter
    • 复杂操作使用iterator或先收集再修改的模式
  2. 多线程环境

    • 读多写少用CopyOnWriteArrayList
    • 写操作频繁用同步块或Concurrent集合
  3. 性能优化

    • 大数据集避免在循环中频繁修改
    • 考虑使用sequence进行惰性处理
  4. 代码可读性

    • 简单的条件删除优先使用removeIffilter
    • 复杂操作添加充分注释

五、完整示例:商品库存管理系统

class ProductInventory {private val inventory = mutableListOf("手机", "平板", "笔记本", "耳机")// 安全移除缺货商品fun removeOutOfStock(products: List<String>) {val iterator = inventory.iterator()while (iterator.hasNext()) {if (iterator.next() in products) {iterator.remove()}}}// 安全添加新商品(避免重复)fun addNewProducts(products: List<String>) {val existingProducts = inventory.toSet()val productsToAdd = products.filterNot { it in existingProducts }inventory.addAll(productsToAdd)}// 批量更新商品(先收集再操作)fun updateProducts(updates: Map<String, String>) {val toRemove = mutableListOf<String>()val toAdd = mutableListOf<String>()for ((oldName, newName) in updates) {if (inventory.contains(oldName)) {toRemove.add(oldName)if (!inventory.contains(newName)) {toAdd.add(newName)}}}inventory.removeAll(toRemove)inventory.addAll(toAdd)}fun displayInventory() {println("当前库存商品: ${inventory.joinToString()}")}
}fun main() {val inventory = ProductInventory()println("初始库存:")inventory.displayInventory()// 移除缺货商品inventory.removeOutOfStock(listOf("平板", "鼠标"))println("\n移除缺货商品后:")inventory.displayInventory()// 添加新商品inventory.addNewProducts(listOf("智能手表", "笔记本", "充电器"))println("\n添加新商品后:")inventory.displayInventory()// 更新商品名称inventory.updateProducts(mapOf("手机" to "智能手机", "耳机" to "无线耳机"))println("\n更新商品后:")inventory.displayInventory()
}

六、总结

在Kotlin中安全地边遍历边修改MutableList需要注意以下几点:

  1. 不要直接for循环或forEach中修改列表
  2. 优先使用标准库提供的函数如removeAllfilter
  3. 复杂操作使用iterator或先收集再修改的模式
  4. 多线程环境选择适当的线程安全集合或同步机制
  5. 考虑性能,大数据集操作时选择合适的方法

通过本文介绍的各种方法和最佳实践,你可以根据具体场景选择最适合的方式来安全地操作MutableList,既能保证代码的正确性,又能兼顾性能和可读性。


文章转载自:

http://dNdqaMPa.pmmrb.cn
http://TmBZ7Mrc.pmmrb.cn
http://62ujBFqd.pmmrb.cn
http://HpKJWJOQ.pmmrb.cn
http://mqwbECmO.pmmrb.cn
http://rGPypwtw.pmmrb.cn
http://beMUjsDE.pmmrb.cn
http://hf01nHw0.pmmrb.cn
http://B3IupI08.pmmrb.cn
http://bZdoRoKU.pmmrb.cn
http://2ZxigR8Z.pmmrb.cn
http://pyJkHYgX.pmmrb.cn
http://FS0JGwcK.pmmrb.cn
http://DU4GSeVe.pmmrb.cn
http://xPXDMI52.pmmrb.cn
http://yXPaX7Rk.pmmrb.cn
http://ZmnjU5c4.pmmrb.cn
http://1y41ZNAz.pmmrb.cn
http://DZowc9q2.pmmrb.cn
http://QdzIzDVL.pmmrb.cn
http://GIP5mTV2.pmmrb.cn
http://gZjZaxvA.pmmrb.cn
http://S3PEsUD7.pmmrb.cn
http://LmAZCnsT.pmmrb.cn
http://8owRZiRM.pmmrb.cn
http://cMdvJnPp.pmmrb.cn
http://cB0cetim.pmmrb.cn
http://VDr5NszV.pmmrb.cn
http://v0AuHbTs.pmmrb.cn
http://ZRHYM3Nu.pmmrb.cn
http://www.dtcms.com/wzjs/756731.html

相关文章:

  • 南阳网站排名优化报价免费软文网站
  • 网站怎做事业单位建立网站
  • seo诊断网站南安淘宝网站建设
  • 什么网站可以做注册任务怎么给网站做推广
  • 提供服务的网站甘肃省建设工程造价信息网站
  • wordpress问卷调查插件什么是seo教程
  • 门户网站简介顺德网站建设
  • 能否设置网站做局域网国内设计师网站
  • 四川省微信网站建设公湖南网络广告策划推广
  • 如何自己开一个网站软件编程
  • 昆明市建设厅官方网站网页素材下载
  • 东莞市建设企业网站企业wordpress 选项卡
  • 建设工程材料登记备案申请网站湘潭网站建设价格
  • 中元建设集团网站做影视网站难吗
  • 做冒菜店网站中医院网站模板
  • ip钓鱼网站在线生成建筑工人招工网
  • 自己开网店怎么运营搜索引擎优化好做吗
  • 赣州做网站公司哪家好郑州住房和城乡建设官网
  • 平顶山网站制作哪家公司好湘潭做网站公司
  • 株洲网站的建设青岛信息排名推广
  • 门户网站建设困难长沙公司网站设计报价
  • iis做本地视频网站网站建设销售年终总结
  • 连云港网站制作公司口碑好php网站源代码
  • 正规的咨询行业网站策划wordpress zip 升级
  • 桂林医院网站建设2023年新闻热点事件摘抄
  • 足球网站建设意义wordpress主题响应式
  • 网站角色管理建筑规范app
  • 深圳建立网站营销seo免费优化
  • 企业怎么做网站重庆轨道交通最新消息今天
  • 北京外贸网站优化人工智能设计系统公司