在 Kotlin 中,ArrayListlistOfarrayListOf 和 mutableListOf 是常用的集合创建方式,但它们在类型、可变性和使用场景上有明显区别。以下是核心对比:

一、基本定义与类型

创建方式类型可变性底层实现
ArrayList<T>()ArrayList<T>可变Java 的 ArrayList
listOf()List<T>(只读接口)不可变Kotlin 内部实现
arrayListOf()ArrayList<T>可变Java 的 ArrayList
mutableListOf()MutableList<T>(可变接口)可变默认 ArrayList

二、具体区别与示例

1. ArrayList<T>()
  • 本质:直接创建 Java 的 ArrayList 类实例。
  • 特点:需显式指定类型(除非通过初始化值推断)。
  • 示例
    val list = ArrayList<String>()  // 创建空的可变列表
    list.add("apple")
    list.add("banana")
    
2. listOf()
  • 本质:创建不可变的只读列表(实现 List 接口)。
  • 特点
    • 由 Kotlin 标准库提供,优化了空列表和单元素列表的内存占用。
    • 调用 add()remove() 等修改方法会抛出 UnsupportedOperationException
  • 示例
    val immutableList = listOf("a", "b", "c")  // 不可变列表
    // immutableList.add("d")  // 编译错误:List 接口无 add() 方法
    
3. arrayListOf()
  • 本质:创建可变的 ArrayList 实例,是 ArrayList() 的快捷方式。
  • 特点
    • 无需显式指定泛型类型(通过初始化值推断)。
    • 完全等价于 ArrayList<T>().apply { addAll(...) }
  • 示例
    val mutableList = arrayListOf("apple", "banana")  // 可变列表
    mutableList.add("cherry")  // 合法
    
4. mutableListOf()
  • 本质:创建实现 MutableList 接口的可变列表,默认是 ArrayList
  • 特点
    • 类型声明为 MutableList,更抽象,允许未来更换实现(如切换为 LinkedList)。
    • 初始化语法更简洁,支持默认参数。
  • 示例
    val mutableList: MutableList<String> = mutableListOf("a", "b")  // 可变列表
    mutableList.add("c")  // 合法
    

三、关键差异总结

1. 可变性
  • 不可变listOf() 创建的列表无法修改,适合作为只读数据容器。
  • 可变ArrayList()arrayListOf()mutableListOf() 创建的列表支持增删改操作。
2. 类型声明
  • listOf() 返回 List<T>,仅包含只读方法(如 get()size)。
  • mutableListOf() 返回 MutableList<T>,包含修改方法(如 add()remove())。
  • ArrayList() 和 arrayListOf() 返回具体类 ArrayList<T>,可调用 ArrayList 特有的方法(如 trimToSize())。
3. 性能与场景
  • 不可变列表:适合作为函数参数或返回值,保证数据不被修改,且内存占用优化。
  • 可变列表:需要动态修改数据时使用,arrayListOf() 和 mutableListOf() 按需选择。

四、使用建议

  1. 优先使用 listOf():当不需要修改列表时,不可变集合更安全。
  2. 优先使用 mutableListOf():需要可变列表时,接口抽象性更好。
  3. 使用 arrayListOf():需要调用 ArrayList 特有方法时(如 ensureCapacity())。
  4. 避免直接 ArrayList():除非需要显式指定初始容量(如 ArrayList(100))。

五、常见误区

  • 混淆类型与可变性List 是只读接口,MutableList 是可变接口,与具体实现(如 ArrayList)无关。
  • 错误转换不可变列表
    val immutable = listOf("a", "b")
    val mutable = immutable as MutableList  // 运行时抛出 ClassCastException!
    


    正确做法:val mutable = mutableListOf<String>().apply { addAll(immutable) }

通过理解这些差异,可在 Kotlin 中更安全、高效地使用集合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86284.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86284.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/86284.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C盘清理技巧分享:释放宝贵空间,提升电脑性能

Hi&#xff0c;我是布兰妮甜 &#xff01;随着电脑使用时间的增长&#xff0c;C盘空间逐渐被各种文件占据&#xff0c;导致系统运行缓慢、程序响应迟钝。对于许多用户来说&#xff0c;C盘空间不足是一个常见且令人头疼的问题。本文将分享一系列实用的C盘清理技巧&#xff0c;帮…

【 感知集群】大规模分布式基础设施的AI赋能蓝图

第一部分&#xff1a;AIOps基础——从被动响应到预测性运维 在本报告的初始部分&#xff0c;我们将为管理一个复杂的大规模集群建立关键的基线。我们认为&#xff0c;在追求高级优化或未来主义架构之前&#xff0c;一个强大、由人工智能驱动的运维基础是不可或缺的。本部分将详…

《R循环:深度解析与高效使用技巧》

《R循环:深度解析与高效使用技巧》 引言 R语言作为一种功能强大的统计计算和图形显示语言,被广泛应用于科研、数据分析、金融等领域。R循环是R语言中的核心概念之一,对于提高编程效率、处理复杂数据至关重要。本文将深度解析R循环,并介绍高效使用技巧,帮助读者更好地掌握…

Windows WSL安装Emscripten‌/emsdk(失败)

前面说过&#xff0c;在CMD、PS下&#xff0c;根本安装不了。那只能试试在WSL安装了。 安装ubuntu 管理员运行PowerShell wsl --install ubuntu自带python3&#xff0c;不需要安装。 安装 我就奇怪了&#xff0c;都说得头头是道&#xff0c;实际上一操作就出问题&#xff…

SpringBoot + EMQX 通过MQTT协议和下位机建立通讯并获取下位机的监测数据-->测试

一、说明 在上一个博客中&#xff0c;我们部署了 EMQX 服务器&#xff0c;实现了 SpringBoot EMQX 通过MQTT协议和下位机建立通讯并获取下位机的监测数据的编码。现在我们对编码进行进一步的测试。 二、编码测试 2.1 在 EMQX 服务器开启客户端认证 这里的客户端认证&#xf…

#17 修改开源模型以适配新任务

在Kaggle的评论区看到有选手想用Swin Transformer来做回归任务,从这个片段可以窥见修改模型的一些思路,于是记录下来学习一下 基于 torchvision Swin_B 模型的特征提取 from torchvision.models.swin_transformer import swin_b, Swin_B_Weights, swin_v2_b, Swin_V2_B_Weig…

变电站自动化系统有哪些设备?

变电站自动化系统是由多类设备协同工作的复杂系统&#xff0c;其设备按功能层级可分为过程层设备​&#xff08;直接连接一次设备&#xff09;、间隔层设备​&#xff08;实现保护控制&#xff09;和站控层设备​&#xff08;数据汇总与监控&#xff09;&#xff0c;同时还包括…

树莓派超全系列教程文档--(66)rpicam-apps可用选项介绍之视频选项

这里写目录标题 视频选项qualitybitrateintraprofilelevelcodecsave-ptskeypresssignalinitialsplitsegmentcircularinlinelistenframesframerate 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 视频选项 本节中指定的命令行选项仅适用于视频输…

C++98和C++11的for循环使用对比

1、C98 中的 传统for 循环 语法结构&#xff1a;这种形式的 for 循环由三个部分组成&#xff1a;初始化语句&#xff08;int i 0&#xff09;、循环条件&#xff08;i < 10&#xff09;和迭代语句&#xff08;i&#xff09;。通常用于遍历一个已知大小的循环范围。使用场景…

ubutun 操作

1.防火墙 Ubuntu 默认使用 ufw&#xff08;Uncomplicated Firewall&#xff09;作为其防火墙管理工具。ufw提供了一个用户友好的界面来配置和管理iptables防火墙。下面是一些基础的ufw命令&#xff0c;帮助你管理Ubuntu的防火墙。 1. 检查UFW状态 sudo ufw status 2. 启用UFW s…

麒麟V10操作系统离线安装Docker、Docker compose和1Panel

安装Docker 下载docker离线安装包&#xff0c;并上传到服务器 下载地址&#xff1a;https://download.docker.com/linux/static/stable/x86_64/ 解压压缩包&#xff0c;并复制到指定目录 tar -xvf xxx.tgzcp docker/* /usr/bin/配置Docker服务&#xff0c;并赋予文件执行权限…

Java 与 MySQL 性能优化:MySQL性能指标解读与监控方法

文章目录 引言一、关键性能指标解读1. QPS&#xff08;Queries Per Second&#xff09;&#xff1a;每秒查询数2. TPS&#xff08;Transactions Per Second&#xff09;&#xff1a;每秒事务数3. 缓存命中率 二、性能监控工具介绍与使用1. SHOW STATUS2. Prometheus Grafana&a…

香橙派3B学习笔记13:deb 打包调用系统库与.so动态链接库的程序(部分失败)

之前接触到了snap打包自己的应用程序与依赖&#xff0c;但它的默认沙盒隔离的机制导致其访问系统库有局限性&#xff0c;它在访问硬件资源的时候没有的那些权限需要额外声明&#xff0c;不符合应用发布的便携性要求。 本文学习下如何用deb打包的方式打包自己需要调用系统库的程…

第二十届“开源中国开源世界”大会:openKylin AI创新实践与成果分享

2025年6月13日&#xff0c;第二十届“开源中国开源世界“大会在北京万寿宾馆隆重召开。本届大会由开源软件推进联盟&#xff08;COPU&#xff09;主办&#xff0c;以“共建人工智能时代的开源生态”为主题&#xff0c;汇聚来自全球开源与AI领域的专家学者、技术领袖与前沿企业&…

微算法科技开发基于布尔函数平方和表示形式的最优精确量子查询算法

随着量子计算的迅猛发展&#xff0c;精确量子查询算法的研究成为量子信息科学的一个重要课题。量子决策树算法&#xff0c;作为量子计算的核心&#xff0c;微算法科技&#xff08;NASDAQ:MLGO&#xff09;提出了一种新的方式来解决布尔函数查询问题。该框架从布尔函数的平方和表…

鸿蒙(HarmonyOS)布局系统详解:Flex、Grid、Stack等布局方式全面解析

在移动应用和分布式系统开发中&#xff0c;界面布局是构建优秀用户体验的基础。鸿蒙操作系统(HarmonyOS)作为华为推出的全场景分布式操作系统&#xff0c;提供了一套强大而灵活的布局系统。本文将全面解析鸿蒙的布局方式&#xff0c;包括Flex、Grid、Stack等核心布局技术&#…

【软件系统架构】系列四:嵌入式软件开发流程全解析(包含示例)

目录 一、需求分析阶段 二、系统架构设计阶段: 三、开发准备阶段 四、底层驱动开发阶段(HAL / BSP) 五、操作系统集成阶段(RTOS / OS) 六、中间件与协议栈集成阶段 七、应用逻辑开发阶段 八、调试与测试阶段: 九、集成与联调阶段 十、发布与维护阶段 总结:完…

接口自动化测试面试(高频面试常问)+答案

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、结合项目讲解项…

Kubernetes 从入门到精通-StatefulSet控制器

一、StatefulSet 基础概念 1. 与 Deployment 的关键区别 特性StatefulSetDeployment网络标识稳定的 DNS 名称随机生成存储每个 Pod 独立 PVC&#xff0c;数据持久化 共享存储或无状态启停顺序严格按序号顺序&#xff08;0→N-1 启动&#xff0c;N-1→0 停止&#xff09;并行适…

Redis ①②-事务

Redis 事务 先来看看 MySQL 事务的四大特性&#xff1a; 原子性&#xff1a;将事务里的多个操作打包成一个整体&#xff0c;要么全部成功&#xff0c;要么全部失败&#xff0c;失败后会进行回滚操作。一致性&#xff1a;确保事务执行前后&#xff0c;其数据的整体变化一致。隔…