Một lý do mà các lớp lập trình năm thứ nhất sử dụng mảng là do di sản: đó là cách các giáo sư ban đầu học nó trước khi chúng tôi bắt đầu sử dụng các thư viện tiêu chuẩn với danh sách động được sử dụng. Sử dụng các kiểu dữ liệu nguyên thủy cũng thường được áp dụng hơn: mảng tồn tại trong hầu hết mọi máy tính ngôn ngữ dưới ánh mặt trời (và có thể được thực hiện trong một số hướng dẫn lắp ráp). Khi tôi mới học lập trình, việc thực hiện một danh sách liên kết là một trong những bài tập.
Bắt đầu từ các nguyên tắc đầu tiên và sau đó nói "Đó là cấu trúc cơ bản. Ngôn ngữ này (hoặc thư viện của nó) cung cấp cho bạn cấu trúc dữ liệu cấp cao này, thực hiện tất cả những điều đó, nhưng cung cấp cho bạn x, y và z" đó là để nói "Vì vậy, đó là những cấu trúc dữ liệu cấp cao, bây giờ đây là những gì đang diễn ra." Học cách suy luận về việc nên sử dụng LinkedList so với ArrayList (hay Hashset so với TreeSet) thường là khóa học Thuật toán năm thứ hai hoặc năm thứ ba. Danh sách và Bản đồ có cùng giao diện và cho cùng kết quả, nhưng có thể có các hành vi khác nhau đáng kể trong một ứng dụng có kích thước bất kỳ. Và một khi bạn thoát khỏi Lập trình 101, không có gì đảm bảo rằng Lập trình 102 sẽ sử dụng cùng một ngôn ngữ. Nếu bạn bắt đầu từ khái niệm về một mảng, bạn chỉ có thể nói "
Một lý do khác để thích "mảng" hơn "Danh sách" trong khóa học giới thiệu là các mảng về cơ bản dễ hiểu: Một mảng 20 bytes
mất 20 byte (cộng với một cặp để chỉ ra phần cuối của mảng hoặc độ dài, tùy thuộc vào việc triển khai ).
"Danh sách" là một ấm cá hoàn toàn khác và có thể được thực hiện theo nhiều cách khác nhau (ArrayList, LinkedList, và có lẽ là một cặp vợ chồng tôi đã quên), với các đặc điểm hiệu suất cơ bản khác nhau. Không hiểu được những gì mà các lớp List khác nhau đang làm, bạn không thể có một cuộc thảo luận có ý nghĩa về thời điểm bạn nên sử dụng List foo = new ArrayList()
so với List foo = new LinkedList()
. Nếu bạn cố gắng để có được những học sinh sử dụng một danh sách thực hiện, một ai đó sẽ hỏi tại sao bạn đang sử dụng ArrayList thay vì một trong những hiện thực khác. Và "ArrayList" bao gồm từ "Array" và được hỗ trợ bởi một, vì vậy nó thực sự không phải là một bước nhảy logic lớn từ "mảng" sang "ArrayList".
Trái với niềm tin phổ biến, có những tình huống trong đó có ý nghĩa khi sử dụng mảng trên Danh sách, đặc biệt khi bạn đang xử lý một danh sách kích thước tĩnh. Đây là một cặp vợ chồng:
- Tra cứu và lặp lại nhanh hơn một chút vì bạn không phải đối phó với phí gọi phương thức: các cuộc hội thảo
foo[n]
và thực hiện một số phép tính con trỏ phía sau hậu trường, trong khi foo.get(n)
phải hủy đăng ký, thực hiện một lời gọi phương thức, thực hiện phép đo thứ hai và sau đó có thể thực hiện số học con trỏ (nếu bạn đang sử dụng ArrayList; LinkedLists có khả năng cần lặp lại trên mọi thành phần của Danh sách).
- Khởi tạo sạch hơn nhiều:
int[] foo = new int[]{1, 2, 3, 4, 5}
so với các đề xuất trong câu hỏi StackOverflow khác