ความแตกต่างระหว่าง ArrayList <String> () และ mutableListOf <String> () ใน Kotlin


110
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

ทั้งสองรายการไม่แน่นอนแล้วสิ่งที่เป็นจุดของทั้งสองคำหลักmutableListOfหรือArrayList?

หรือมีความแตกต่างที่สำคัญ?


7
ทั้งmutableListOfมิได้ArrayListมีคำหลักใน Kotlin
Ilya

คำตอบ:


150

ความแตกต่างเพียงอย่างเดียวระหว่างทั้งสองคือการสื่อสารเจตนาของคุณ

เมื่อคุณเขียนval a = mutableListOf()คุณกำลังพูดว่า "ฉันต้องการรายการที่ไม่แน่นอนและฉันไม่สนใจเป็นพิเศษเกี่ยวกับการนำไปใช้งาน" เมื่อคุณเขียนแทนคุณval a = ArrayList()จะพูดว่า "ฉันต้องการโดยเฉพาะArrayList"

ในทางปฏิบัติในการใช้งาน Kotlin ที่รวบรวมกับ JVM ในปัจจุบันการโทรmutableListOfจะสร้างArrayListและไม่มีความแตกต่างในพฤติกรรม: เมื่อสร้างรายการแล้วทุกอย่างจะทำงานเหมือนเดิม

ตอนนี้สมมติว่า Kotlin เวอร์ชันในอนาคตmutableListOfจะเปลี่ยนเพื่อส่งคืนรายการประเภทอื่น

Likelier ไม่ใช่ทีม Kotlin จะทำการเปลี่ยนแปลงนั้นก็ต่อเมื่อพวกเขาคิดว่าการใช้งานใหม่ทำงานได้ดีขึ้นสำหรับกรณีการใช้งานส่วนใหญ่ mutableListOfจากนั้นคุณจะใช้การติดตั้งรายการใหม่นั้นอย่างโปร่งใสและคุณจะได้รับพฤติกรรมที่ดีขึ้นนั้นฟรี ไปด้วยmutableListOfหากฟังดูเหมือนกรณีของคุณ

ในทางกลับกันบางทีคุณอาจใช้เวลามากมายในการคิดเกี่ยวกับปัญหาของคุณและคิดว่าArrayList สิ่งนั้นเหมาะสมที่สุดสำหรับปัญหาของคุณและคุณไม่ต้องการเสี่ยงที่จะถูกย้ายไปยังสิ่งที่ไม่เหมาะสม จากนั้นคุณอาจต้องการใช้ArrayListโดยตรงหรือใช้arrayListOfฟังก์ชั่นโรงงาน ( ArrayListอะนาล็อกเฉพาะถึงmutableListOf)


26

mutableListOf<T>()เป็นการเรียกใช้ฟังก์ชันแบบอินไลน์ที่ส่งกลับไฟล์ MutableList<T>. ณ วันนี้mutableListOfจะส่งคืนอินสแตนซ์ของArrayList.

ArrayList<String>() เป็นการเรียกใช้ตัวสร้างและไม่สามารถขีดเส้นใต้ได้

กล่าวอีกนัยหนึ่งให้:

 val a = mutableListOf<String>()
 val b = ArrayList<String>()
  • a เป็นประเภท MutableList<String>
  • b เป็นประเภท ArrayList<String>

ในรันไทม์ทั้งสองaและbจะถืออินสแตนซ์ของArrayList.

โปรดทราบว่าอินไลน์เป็นประโยชน์อย่างยิ่งเมื่อรวมกับประเภททำให้เป็นจริงซึ่ง justifies การดำรงอยู่ของlistOf, mutableListOfและชอบ


2
ดังนั้นจึงไม่มีความแตกต่างกัน
สาย

4
aและbมีประเภทการประกาศที่แตกต่างกันดังนั้นเวลาคอมไพล์จึงมีความแตกต่างกัน
miensol

สามารถval b = arrayListOf<String>()
Vlad

8

ดังที่คุณเห็นในแหล่งที่มา :

public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()

ดังนั้นไม่มีความแตกต่างเพียงแค่วิธีการอำนวยความสะดวก


1
และฉันจะใส่ "ความสะดวกสบาย" ในเครื่องหมายคำพูด จนกว่า MutableList จะมีการนำไปใช้งานที่แตกต่างกันการให้อ็อบเจ็กต์หลักที่ทำสิ่งเดียวกับอ็อบเจ็กต์หลักอื่น ๆ นั้นทำให้เกิดความสับสนและไม่สะดวกเลย :(
Mike Williamson

@MikeWilliamson เนื่องจากรายการอาร์เรย์เป็นหนึ่งในสิ่งที่สับสนที่สุดคือ Java สำหรับฉันแล้วมันเป็นอาร์เรย์หรือรายการ แต่ทั้งสองอย่าง? หัวของฉันระเบิด ฉันพบว่ารายการที่เปลี่ยนแปลงไม่ได้เป็นชื่อที่สมบูรณ์แบบสำหรับประเภทที่มีชื่อแปลก ๆ
t3chb0t
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.