Sự khác biệt giữa ArrayList <String> () và mutableListOf <String> () trong Kotlin


101
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

Cả hai đều là danh sách có thể thay đổi, sau đó là những gì các điểm của hai từ khóa mutableListOfhoặc ArrayList?

hoặc có sự khác biệt lớn nào không?


6
Cả mutableListOfcũng ArrayListlà từ khóa trong Kotlin
Ilya

Câu trả lời:


141

Sự khác biệt duy nhất giữa hai là truyền đạt ý định của bạn.

Khi bạn viết val a = mutableListOf(), bạn đang nói "Tôi muốn một danh sách có thể thay đổi và tôi không đặc biệt quan tâm đến việc triển khai". Thay vào đó, khi bạn viết, val a = ArrayList()bạn đang nói "Tôi đặc biệt muốn một ArrayList".

Trên thực tế, trong quá trình triển khai hiện tại của Kotlin biên dịch sang JVM, việc gọi mutableListOfsẽ tạo ra ArrayListvà không có sự khác biệt về hành vi: một khi danh sách được tạo, mọi thứ sẽ hoạt động giống nhau.

Bây giờ, giả sử rằng một phiên bản tương lai của Kotlin thay đổi mutableListOfđể trả về một loại danh sách khác.

Dễ thấy hơn là không, nhóm Kotlin sẽ chỉ thực hiện thay đổi đó nếu họ nhận thấy việc triển khai mới hoạt động tốt hơn cho hầu hết các trường hợp sử dụng. mutableListOfsau đó sẽ yêu cầu bạn sử dụng triển khai danh sách mới đó một cách minh bạch và bạn sẽ có được hành vi tốt hơn đó miễn phí. Đi với mutableListOfnếu điều đó giống như trường hợp của bạn.

Mặt khác, có thể bạn đã dành nhiều thời gian để suy nghĩ về vấn đề của mình và nhận ra rằng đó ArrayList thực sự là cách phù hợp nhất cho vấn đề của bạn và bạn không muốn mạo hiểm chuyển sang một thứ gì đó không tối ưu. Sau đó, bạn có thể muốn sử dụng ArrayListtrực tiếp hoặc sử dụng arrayListOfchức năng gốc (một hàm ArrayListtương tự cụ thể với mutableListOf).


21

mutableListOf<T>()là một lệnh gọi hàm nội tuyến trả về a MutableList<T>. Kể từ hôm nay, mutableListOftrả về một phiên bản của ArrayList.

ArrayList<String>() là một lời gọi phương thức khởi tạo và không thể được nội dòng.

Nói cách khác, đã cho:

 val a = mutableListOf<String>()
 val b = ArrayList<String>()
  • a thuộc loại MutableList<String>
  • b thuộc loại ArrayList<String>

Trong thời gian chạy, cả hai absẽ giữ một phiên bản của ArrayList.

Lưu ý rằng nội tuyến là đặc biệt hữu ích khi kết hợp với loại reification , mà biện minh cho sự tồn tại của listOf, mutableListOfvà những thứ tương tự.


2
Vì vậy, không có sự khác biệt.
Sai

2
abcó kiểu khai báo khác nhau - vì vậy có sự khác biệt tại thời điểm biên dịch.
miensol

Nó có thể được gạch đầu dòng làval b = arrayListOf<String>()
Vlad

8

Như bạn có thể thấy trong các nguồn :

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

Vì vậy, không có sự khác biệt, chỉ là một phương pháp thuận tiện.


1
Và tôi sẽ đặt "sự tiện lợi" trong dấu ngoặc kép. Cho đến khi MutableList thực sự có một cách triển khai khác, việc cung cấp một đối tượng cốt lõi thực hiện điều tương tự như một đối tượng cốt lõi khác là điều khó hiểu và hoàn toàn không thuận tiện. :(
Mike Williamson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.