Đây là một câu hỏi về phong cách và sở thích nhưng ở đây đi: khi nào tôi nên sử dụng scala.Array? Tôi sử dụng List tất cả thời gian và thỉnh thoảng chạy vào Seq, Map và những thứ tương tự, nhưng tôi chưa bao giờ sử dụng hay nhìn thấy Array trong tự nhiên. Có phải chỉ có khả năng tương thích với Java không? Tôi có thiếu một trường hợp sử dụng phổ biến không?Khi nào tôi nên sử dụng Array của Scala thay vì một trong các bộ sưu tập khác?
Trả lời
Trước hết, hãy thực hiện tuyên bố từ chối trách nhiệm tại đây. Scala 2.7 Array
cố gắng trở thành một Java Array
và Bộ sưu tập Scala cùng một lúc. Nó chủ yếu thành công, nhưng thất bại ở cả hai trường hợp góc. Thật không may, những trường hợp góc có thể xảy ra với những người tốt với mã bình thường, do đó, Scala 2,8 là khởi hành từ đó.
Trên Scala 2.8, có Array
, là Java Array
. Điều đó có nghĩa là nó là một không gian bộ nhớ liền kề, lưu trữ các tham chiếu hoặc nguyên thủy (và, do đó, có thể có các kích thước phần tử khác nhau), và có thể được truy cập ngẫu nhiên khá nhanh. Nó cũng có các phương pháp tệ hại, thực hiện toString
khủng khiếp và thực hiện xấu khi sử dụng các generic và primitives cùng một lúc (ví dụ: def f[T](a: Array[T]) = ...; f(Array(1,2,3))
).
Và, sau đó, có GenericArray
, là Bộ sưu tập Scala được hỗ trợ bởi Array
. Nó luôn luôn lưu trữ nguyên thủy đóng hộp, do đó, nó không có vấn đề hiệu suất khi trộn nguyên thủy và generics nhưng, mặt khác, nó không có hiệu suất đạt được của một thuần túy nguyên thủy (không chung chung) mảng nguyên thủy.
Vì vậy, khi nào nên sử dụng cái gì? Một Array
có những đặc điểm sau đây:
- O (1) ngẫu nhiên đọc và viết
- O (n) append/thêm vào trước/chèn/xóa
- mutable
Nếu bạn không cần generics, hoặc generics của bạn có thể được tuyên bố là [T <: AnyRef]
, do đó loại trừ nguyên thủy, là AnyVal
, và những đặc điểm này là tối ưu cho mã của bạn, sau đó đi cho nó.
Nếu bạn cần generics, bao gồm nguyên thủy, và những đặc điểm này là tối ưu cho mã của bạn, hãy sử dụng GenericArray
trên Scala 2.8. Ngoài ra, nếu bạn muốn có một Bộ sưu tập thực sự, với tất cả các phương pháp của nó, bạn cũng có thể muốn sử dụng nó, thay vì phụ thuộc vào các chuyển đổi ngầm định.
Nếu bạn muốn bất biến hoặc nếu bạn cần hiệu suất tốt để nối, thêm, chèn hoặc xóa, hãy tìm một số bộ sưu tập khác.
Cảm ơn, Daniel, đây là một câu trả lời tuyệt vời. – pr1001
Một mảng phù hợp khi bạn có một số mục có cùng lớp (hoặc tương thích) và bạn biết trước số đếm chính xác của các mục đó hoặc giới hạn trên hợp lý và bạn quan tâm đến ngẫu nhiên nhanh truy cập và có thể thay đổi tại chỗ các mục, nhưng sau khi thiết lập nó, bạn sẽ không bao giờ chèn hoặc loại bỏ các mục từ một nơi nào đó trong danh sách.
Hoặc được nói theo cách khác, đó là cấu trúc dữ liệu tổng hợp có ít chuông và còi hơn so với loại Bộ sưu tập, với chi phí thấp hơn một chút và hiệu suất tốt hơn một chút tùy thuộc vào cách sử dụng.
Ví dụ rất hay: Bạn đang trong quá trình sản xuất các chức năng và kiểm tra chất lượng cho các chức năng này liên quan đến việc kiểm tra hiệu suất hoặc kết quả của chúng cho một tập hợp 1000 giá trị đầu vào cố định. Hơn nữa, bạn quyết định không giữ các giá trị này trong một tệp, mà đúng hơn là bạn mã hóa chúng vào chương trình của bạn. Một mảng sẽ là thích hợp.
interfacing với Java API là một trường hợp. Cũng không giống như mảng Java mảng scala là bất biến và do đó không có bất kỳ lợi thế hơn danh sách vì điều đó.
Tôi có nên đặt wiki này thành cộng đồng không? – pr1001
Tôi không nghĩ vậy. Những ưu điểm và nhược điểm của việc sử dụng Mảng Scala được định nghĩa khá tốt và có thể được tranh luận về khách quan. Câu hỏi là âm thanh, IMHO. –