Trong OpenJDK 1.8, java.util.ArrayList#sort(Comparator)
không sao chép mảng nội bộ của nó; nó sắp xếp đúng chỗ, như bạn đề nghị.
Việc thực hiện java.util.List#sort()
bạn đang chỉ trích có tài liệu hướng dẫn kèm theo sau đây:
Việc thực hiện mặc định có được một mảng chứa tất cả các yếu tố trong danh sách này, sắp xếp mảng, và lặp trên danh sách này đặt mỗi phần tử từ vị trí tương ứng trong mảng. (Điều này tránh sự n ² log (n) hiệu suất đó sẽ là kết quả của nỗ lực để sắp xếp một danh sách liên kết tại chỗ.)
Đó là, sao chép mảng và di chuyển xung quanh với truy cập ngẫu nhiên là hiệu quả hơn so với chi phí đi vòng quanh tuyến tính trong danh sách được liên kết. Các nỗ lực thực hiện phổ biến để giao dịch chi phí sao chép cho chi phí truy cập phần tử. Đối với các trường hợp như ArrayList
trong trường hợp việc sao chép không cần thiết để có cùng quyền truy cập ngẫu nhiên vào các phần tử, thư viện bỏ qua bản sao bằng cách ghi đè phương thức.
Một so sánh thú vị: Nhìn vào C++ Library Standard std::sort()
và std::list::sort()
chức năng:
std::sort()
Yêu cầu thông số phân định một phạm vi với truy cập ngẫu nhiên.
std::list::sort()
Giả sử chỉ truy cập tuyến tính bằng cách duyệt qua các nút danh sách được liên kết.
Các generic std::sort()
thuật toán hiệu quả hơn, nhưng thư viện ngăn cản gọi nó trên một std::list
(mà là một danh sách liên kết, giống như Java java.util.LinkedList
). Thư viện cung cấp một phương tiện kém hiệu quả hơn để sắp xếp một số std::list
để thuận tiện. Không giống như thư viện Java, thư viện C++ không sao chép một std::list()
vào một mảng để sử dụng thuật toán truy cập ngẫu nhiên std::sort()
.
Có nhiều triển khai danh sách, bao gồm danh sách được liên kết, trong đó việc sắp xếp danh sách có thể đắt hơn. –
"Có vẻ như không thể sao chép các giá trị vào mảng trong trường hợp ArrayList." - và đó chính là cách nó được thực hiện. – xehpuk
Cảm ơn bạn đã phản hồi nhanh. –