Kotlin 中ArrayList、listOf、arrayListOf 和 mutableListOf區別

在 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;其數據的整體變化一致。隔…