Bởi vì bạn đề cập đến cons
chức năng, tôi sẽ cho rằng bạn đang tiếp cận vấn đề này với các mô hình khái niệm của danh sách liên kết gồm cons
tế bào. Cụ thể, tôi giả định rằng bạn đang nghĩ đến mỗi danh sách có một số car
(phần tử đầu tiên) và một số cdr
(danh sách con chứa tất cả các phần tử sau).
Java hỗ trợ danh sách được liên kết dưới dạng java.util.LinkedList
. Đây là tốt cho traversal tuyến tính và có thể có các yếu tố chèn rất hiệu quả. Đây là hầu hết tương tự như các danh sách liên kết tôi đã đề cập ở trên.
Java cũng cung cấp java.util.ArrayList
. Danh sách loại này tốt cho truy cập ngẫu nhiên, nhưng có thể chậm khi chèn các phần tử. Trong thực tế, chúng chậm nhất khi chèn một phần tử vào đầu danh sách. Bởi vì ArrayList
s được triển khai dưới dạng mảng đằng sau hậu trường, mọi phần tử phải được sao chép một vị trí chuyển tiếp trong danh sách để tạo chỗ cho phần tử đầu tiên mới. Bây giờ, nếu bạn cũng cần một mảng lớn hơn, thì ArrayList
sẽ cấp phát một mảng mới, sao chép tất cả các phần tử trên, v.v.
(của ImmutableList
Google được trích dẫn là "truy cập ngẫu nhiên", vì vậy nó có khả năng tương tự như sau.)
Nếu bạn có kế hoạch để sử dụng phương pháp cons
của bạn thường xuyên, tôi khuyên bạn nên sử dụng nó với danh sách liên kết. Hoạt động của cons
về bản chất là thêm phần tử vào đầu danh sách. Điều này có ý nghĩa rất ít với các cấu trúc tuyến tính như mảng. Tôi khuyên bạn không nên sử dụng danh sách mảng vì lý do này: rằng chúng sai về mặt khái niệm cho công việc.
Đối với rất kén chọn: vì một danh sách mới được trả mỗi lần cons
được gọi, sao chép phải xảy ra cho dù danh sách là một LinkedList
hoặc một ArrayList
. Tuy nhiên, toàn bộ hiệu trưởng của hoạt động cons
là nó hoạt động trên danh sách được liên kết.
public <E> LinkedList<E> cons(E car, List<E> cdr) {
LinkedList<E> destination = new LinkedList<E>(cdr);
destination.addFirst(car);
return destination;
}
Lưu ý rằng đoạn mã trên được viết sau khi đọc câu trả lời ở trên, vì vậy tôi xin lỗi vì bất kỳ đạo văn ngẫu nhiên. Hãy cho tôi biết nếu bạn nhìn thấy nó và tôi sẽ thừa nhận đúng.
Giả sử bạn hài lòng khi trả lại LinkedList
, bạn có thể sử dụng ImmutableList
làm ví dụ cdr
trong ví dụ này.
Đối với những người trong chúng ta không quen thuộc với Lisp, là những gì nhược điểm? –
Tôi đã xác định hành vi và đưa ra một ví dụ. Nhiều hơn những gì bạn muốn? –