Trong danh sách được liên kết, mỗi phần tử có một con trỏ tới phần tử tiếp theo:
head -> item1 -> item2 -> item3 -> etc.
Để truy cập item3
, bạn có thể thấy rõ rằng bạn cần đi bộ từ đầu qua mọi nút cho đến khi bạn đến mục3, vì bạn không thể nhảy trực tiếp.
Vì vậy, nếu tôi muốn in giá trị của từng thành phần, nếu tôi viết điều này:
for(int i = 0; i < 4; i++) {
System.out.println(list.get(i));
}
chuyện gì xảy ra thế này:
head -> print head
head -> item1 -> print item1
head -> item1 -> item2 -> print item2
head -> item1 -> item2 -> item3 print item3
Điều này là không hiệu quả khủng khiếp vì mỗi khi bạn lập chỉ mục, nó sẽ khởi động lại từ đầu danh sách và đi qua mọi mục. Điều này có nghĩa là sự phức tạp của bạn có hiệu quả O(N^2)
chỉ để vượt qua danh sách!
Nếu thay vào đó tôi đã làm điều này:
for(String s: list) {
System.out.println(s);
}
Sau đó, những gì xảy ra là:
head -> print head -> item1 -> print item1 -> item2 -> print item2 etc.
tất cả trong một giao dịch duy nhất, đó là O(N)
.
Bây giờ, đi đến việc thực hiện khác List
được ArrayList
, một trong đó là được hỗ trợ bởi một mảng đơn giản. Trong trường hợp đó, cả hai đường ngang trên đều tương đương nhau, vì một mảng nằm liền kề nhau nên nó cho phép nhảy ngẫu nhiên đến các vị trí tùy ý.