Một số câu lệnh ở đây gây nhầm lẫn hoặc thậm chí sai, đặc biệt là ý tưởng rằng bất biến.Vector trong Scala là bất cứ thứ gì giống như một ArrayList. Danh sách và Vector đều là cấu trúc dữ liệu bất biến, liên tục (nghĩa là "giá rẻ để có bản sao sửa đổi"). Không có lựa chọn mặc định hợp lý vì chúng có thể dành cho các cấu trúc dữ liệu có thể thay đổi, nhưng nó phụ thuộc vào thuật toán của bạn đang làm gì. Danh sách là một danh sách liên kết đơn, trong khi Vector là bộ ba số nguyên cơ bản 32, tức là nó là một loại cây tìm kiếm với các nút cấp 32. Sử dụng cấu trúc này, Vector có thể cung cấp hầu hết các hoạt động phổ biến một cách hợp lý nhanh chóng, tức là trong O (log_32 ( n)). Nó hoạt động để thêm vào, nối thêm, cập nhật, truy cập ngẫu nhiên, phân tách ở đầu / đuôi. Lặp lại theo thứ tự tuần tự là tuyến tính. Mặt khác, danh sách chỉ cung cấp phép lặp tuyến tính và trả trước thời gian liên tục, phân tách ở đầu / đuôi.
Điều này có thể trông giống như Vector là một sự thay thế tốt cho Danh sách trong hầu hết các trường hợp, nhưng trả trước, phân tách và lặp lại thường là các thao tác quan trọng trên các chuỗi trong một chương trình chức năng và các hằng số của các hoạt động này cao hơn nhiều so với vector do cấu trúc phức tạp hơn của nó. Tôi đã thực hiện một vài phép đo, vì vậy, việc lặp lại nhanh hơn khoảng hai lần cho danh sách, việc trả trước nhanh hơn khoảng 100 lần trong danh sách, sự phân rã ở đầu / đuôi nhanh hơn khoảng 10 lần trong danh sách và việc tạo ra từ một giao dịch nhanh hơn khoảng 2 lần cho các vectơ. (Điều này có thể là do Vector có thể phân bổ các mảng gồm 32 phần tử cùng một lúc khi bạn xây dựng nó bằng cách sử dụng trình xây dựng thay vì thêm trước hoặc nối thêm các phần tử một).
Vậy chúng ta nên sử dụng cấu trúc dữ liệu nào? Về cơ bản, có bốn trường hợp phổ biến:
- Chúng ta chỉ cần chuyển đổi các chuỗi bằng các hoạt động như bản đồ, bộ lọc, gấp vv: về cơ bản không thành vấn đề, chúng ta nên lập trình thuật toán của mình một cách tổng quát và thậm chí có thể hưởng lợi từ việc chấp nhận các chuỗi song song. Đối với các hoạt động tuần tự Danh sách có thể nhanh hơn một chút. Nhưng bạn nên điểm chuẩn nó nếu bạn phải tối ưu hóa.
- Chúng tôi cần rất nhiều quyền truy cập ngẫu nhiên và các bản cập nhật khác nhau, vì vậy chúng tôi nên sử dụng véc tơ, danh sách sẽ bị cấm rất chậm.
- Chúng tôi hoạt động trên các danh sách theo cách chức năng cổ điển, xây dựng chúng bằng cách thêm trước và lặp lại bằng cách phân tách đệ quy: danh sách sử dụng, vectơ sẽ chậm hơn theo hệ số 10-100 trở lên.
- Chúng tôi có một thuật toán quan trọng về hiệu năng về cơ bản là bắt buộc và có rất nhiều quyền truy cập ngẫu nhiên trong danh sách, giống như sắp xếp nhanh: sử dụng cấu trúc dữ liệu bắt buộc, ví dụ ArrayBuffer, cục bộ và sao chép dữ liệu của bạn từ đó sang nó.
List<String> l = new ArrayList<String>()
các blog Scala viết, bạn có tin rằng mọi người đều sử dụng Danh sách để có được sự tốt lành của bộ sưu tập không - nhưng liệu mục đích chung của Vector có đủ để chúng ta nên sử dụng nó ở vị trí của List không?