Câu trả lời:
Scala List
là một bất biến cấu trúc dữ liệu đệ quy mà là một cấu trúc cơ bản như vậy trong Scala, mà bạn nên (có lẽ) được sử dụng nó nhiều hơn một Array
(mà thực sự có thể thay đổi - những analog bất biến của Array
là IndexedSeq
).
Nếu bạn đang đến từ một nền tảng Java, thì song song rõ ràng là khi nào sử dụng LinkedList
qua ArrayList
. Cái trước thường được sử dụng cho các danh sách chỉ được duyệt qua (và kích thước không được biết trước) trong khi cái sau nên được sử dụng cho các danh sách có kích thước đã biết (hoặc kích thước tối đa) hoặc truy cập ngẫu nhiên nhanh là quan trọng.
ListBuffer
cung cấp một chuyển đổi thời gian không đổi thành một List
lý do duy nhất để sử dụng ListBuffer
nếu việc chuyển đổi sau này là bắt buộc.
Scala Array
nên được triển khai trên JVM bởi một mảng Java và do đó, một trình diễn Array[Int]
có thể hiệu quả hơn (như một int[]
) so với List[Int]
(sẽ đóng hộp nội dung của nó, trừ khi bạn đang sử dụng các phiên bản Scala mới @specialized
nhất có tính năng mới ) .
Tuy nhiên, tôi nghĩ rằng việc sử dụng Array
s trong Scala nên được giữ ở mức tối thiểu vì cảm giác như bạn thực sự cần biết những gì đang diễn ra dưới mui xe để quyết định xem mảng của bạn có thực sự được hỗ trợ bởi kiểu nguyên thủy cần thiết hay không được đóng hộp như một loại bao bọc.
Ngoài các câu trả lời được đăng, đây là một số chi tiết cụ thể.
Trong khi một Array[A]
nghĩa đen là một mảng Java, thì a List[A]
là một cấu trúc dữ liệu bất biến là Nil
(danh sách trống) hoặc bao gồm một cặp (A, List[A])
.
Hiệu suất khác biệt
Array List
Access the ith element θ(1) θ(i)
Delete the ith element θ(n) θ(i)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
Count the elements θ(1) θ(n)
Sự khác biệt về bộ nhớ
Array List
Get the first i elements θ(i) θ(i)
Drop the first i elements θ(n-i) θ(1)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
Vì vậy, trừ khi bạn cần truy cập ngẫu nhiên nhanh chóng, cần phải đếm các yếu tố hoặc vì lý do nào đó bạn cần cập nhật mang tính hủy diệt, List
thì tốt hơn là một Array
.
list = list.drop(i)
. Hoặc, Có xảy ra một số phép thuật đằng sau mui xe?
drop
không bao giờ cần sao chép phần danh sách không bị loại bỏ. Ví dụ , (x::xs).drop(1)
chính xác xs
, không phải là "bản sao" của xs
.
Một mảng có thể thay đổi, nghĩa là bạn có thể thay đổi các giá trị của từng chỉ mục, trong khi Danh sách (theo mặc định) là không thay đổi, có nghĩa là một danh sách mới được tạo mỗi khi bạn thực hiện sửa đổi. Trong hầu hết các trường hợp, nó là một "chức năng" phong cách hơn để làm việc với các kiểu dữ liệu bất biến và có lẽ bạn nên thử và sử dụng một danh sách với cấu trúc như yield
, foreach
, match
và vân vân.
Đối với các đặc tính hiệu suất, một Mảng nhanh hơn với quyền truy cập ngẫu nhiên vào các phần tử, trong khi Danh sách nhanh hơn khi thêm (thêm) các phần tử mới. Lặp đi lặp lại trên chúng là so sánh.
iterate over
, vì bộ đệm