Perbedaan antara ArrayList <String> () dan mutableListOf <String> () di Kotlin

110
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

Keduanya adalah daftar yang bisa berubah, lalu apa gunanya dua kata kunci mutableListOfatau ArrayList?

atau apakah ada perbedaan besar?

Sai
sumber
7
Tidak mutableListOfjuga ArrayListada kata kunci di Kotlin
Ilya

Jawaban:

150

Satu-satunya perbedaan antara keduanya adalah mengomunikasikan maksud Anda.

Saat Anda menulis val a = mutableListOf(), Anda mengatakan "Saya ingin daftar yang bisa berubah, dan saya tidak terlalu peduli dengan implementasinya". Saat Anda menulis, sebaliknya val a = ArrayList(), Anda mengatakan "Saya secara khusus menginginkan ArrayList".

Dalam praktiknya, dalam implementasi kompilasi Kotlin ke JVM saat ini, pemanggilan mutableListOfakan menghasilkan ArrayList, dan tidak ada perbedaan dalam perilaku: setelah daftar dibuat, semuanya akan berperilaku sama.

Sekarang, katakanlah versi Kotlin yang akan datang berubah mutableListOfuntuk mengembalikan jenis daftar yang berbeda.

Lebih mungkin daripada tidak, tim Kotlin hanya akan membuat perubahan itu jika mereka menganggap implementasi baru bekerja lebih baik untuk sebagian besar kasus penggunaan. mutableListOfkemudian akan meminta Anda menggunakan penerapan daftar baru tersebut secara transparan, dan Anda akan mendapatkan perilaku yang lebih baik secara gratis. Pergi dengan mutableListOfjika itu terdengar seperti kasus Anda.

Di sisi lain, mungkin Anda menghabiskan banyak waktu berpikir tentang masalah Anda, dan berpikir bahwa ArrayList benar-benar adalah cocok untuk masalah Anda, dan Anda tidak ingin risiko mendapatkan pindah ke sesuatu yang sub-optimal. Kemudian Anda mungkin ingin menggunakan ArrayListsecara langsung, atau menggunakan arrayListOffungsi pabrik ( ArrayListanalog -specific to mutableListOf).

pdpi
sumber
26

mutableListOf<T>()adalah pemanggilan fungsi sebaris yang mengembalikan a MutableList<T>. Pada hari ini, mutableListOftidak mengembalikan instance ArrayList.

ArrayList<String>() adalah pemanggilan konstruktor dan tidak bisa sebaris.

Dengan kata lain, diberikan:

 val a = mutableListOf<String>()
 val b = ArrayList<String>()
  • a adalah tipe MutableList<String>
  • b adalah tipe ArrayList<String>

Saat runtime, keduanya adan bakan menyimpan instance ArrayList.

Perhatikan bahwa penyebarisan sangat berguna jika dikombinasikan dengan reifikasi tipe , yang membenarkan keberadaan listOf, mutableListOfdan sejenisnya.

miensol
sumber
2
Jadi tidak ada bedanya.
Sai
4
adan bmemiliki tipe yang dideklarasikan berbeda - jadi ada perbedaan pada waktu kompilasi.
miensol
Ini dapat disisipkan sebagaival b = arrayListOf<String>()
Vlad
8

Seperti yang Anda lihat di sumber :

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

Jadi, tidak ada perbedaan, hanya metode kenyamanan.

azizbekian
sumber
1
Dan saya akan menempatkan "kenyamanan" dalam tanda kutip. Hingga MutableList benar-benar memiliki implementasi yang berbeda, menyediakan objek inti yang melakukan hal yang sama dengan objek inti lainnya akan membingungkan, dan sama sekali bukan kenyamanan. :(
Mike Williamson
@MikeWilliamson karena array-list adalah salah satu hal yang paling membingungkan adalah Java, bagi saya itu adalah array atau daftar tetapi keduanya? Kepalaku meledak. Saya menemukan mutable-list adalah nama yang sempurna untuk tipe bernama aneh.
t3chb0t