Tại sao các trường dạy mảng trên Danh sách? [đóng cửa]


36

Hầu hết các bài tập trong trường của tôi cho các lớp lập trình ban đầu đều yêu cầu tôi sử dụng mảng. Bây giờ tôi làm việc toàn thời gian và tôi chưa bao giờ sử dụng một mảng cho bất kỳ dự án nào mà tôi đã làm việc. Ngay cả trong các dự án hiện tại, tôi chưa bao giờ thấy việc sử dụng mảng ở bất cứ đâu. Theo tôi, List dễ sử dụng hơn và là một tiêu chuẩn. Tại sao các giáo sư bảo sinh viên sử dụng mảng trong bài tập của họ? Có phải chỉ để học sinh hiểu những điều cơ bản?

Vì hầu hết các trường đại học đều dạy Java, nên câu hỏi này dành riêng cho Java.


7
Mảng là cơ bản hơn.
dùng253751

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Kỹ sư thế giới

Câu trả lời:


120

Bởi vì mảng dạy các khái niệm như lập chỉ mục và giới hạn, hai khái niệm cơ bản quan trọng trong lập trình máy tính.

Danh sách không phải là một "tiêu chuẩn." Có rất nhiều không gian vấn đề mà mảng là phù hợp hoàn hảo.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Kỹ sư thế giới

48

Có lẽ họ muốn bắt đầu với cấu trúc dữ liệu thể hiện chính xác nhất cách thức máy tính hoạt động, vì vậy bạn đã quen với các nguyên tắc cơ bản trước khi bắt đầu giới thiệu các bản tóm tắt cấp cao hơn như Danh sách giúp dễ dàng làm việc hơn. Mặt khác, bạn không có cách nào để hiểu tại sao một cấu trúc hoặc thuật toán nhất định lại chậm / nhanh đối với một số hoạt động mà không phải các hoạt động khác; nếu bộ nhớ máy tính thực sự được tạo ra từ danh sách liên kết thì thế giới sẽ là một nơi rất khác.

Vì nhiều lý do tương tự, lớp lập trình đầu tiên của tôi ở trường đại học là ở C và các lớp còn lại đều bằng C ++, Java và các ngôn ngữ khác. Không phải C bằng cách nào đó tốt hơn hay dễ dàng hơn, đó là C (và Mảng) không giấu bạn điều gì.


7
Một danh sách dễ làm việc hơn với mã thực, nhưng một mảng dễ hiểu hơn (hoàn toàn) và quan trọng hơn để hiểu vì chúng là cơ bản và phổ quát, trong khi Danh sách (Java) thì không. Ít nhất đó là ý kiến ​​của tôi.
Ixrec

21
Một nhiệm vụ trong đó bạn lưu trữ công cụ trong một mảng và truy cập nó sau đó là một nhiệm vụ cấu trúc dữ liệu . Bạn chỉ có thể không nhận ra nó. Bạn phải tự hỏi, điều gì tạo ra các kỹ sư tốt hơn, hiểu các mô hình tính toán cơ bản hoặc học thư viện chuẩn của ngôn ngữ? Sự đồng thuận chung (và tôi đồng ý, fwiw) là bạn sẽ không hiểu nhiều nội dung thư viện mà không hiểu những điều cơ bản về tính toán.
Kent A.

12
LinkedList, ArrayList, OrderedList, v.v ... Bạn nên học danh sách nào trước? Làm thế nào bạn đánh giá cao những gì họ làm cho bạn nếu bạn không hiểu tại sao họ tồn tại ở nơi đầu tiên?
Kent A.

10
+1 cho @KentAnderson. Các trường phải sản xuất các kỹ sư hiểu cấu trúc dữ liệu ở mức độ thấp; lý tưởng là các kỹ sư sản xuất có thể dễ dàng thực hiện các cấu trúc cơ bản trong C. Bất kỳ chương trình nào khác chỉ là một JavaSchool.
Christian Willman

2
"Có lẽ họ muốn bắt đầu với cấu trúc dữ liệu thể hiện chính xác nhất cách thức máy tính hoạt động" - Vậy, còn máy tính có bộ nhớ cấu trúc danh sách hoặc cấu trúc đối tượng thì sao? "Không phải C bằng cách nào đó tốt hơn hay dễ dàng hơn, đó là C (và Mảng) không giấu bạn điều gì." - Trừ khi máy tính của bạn không có con trỏ, như AS / 400, trong đó C về cơ bản chạy trong VM và ẩn khá nhiều thứ cho bạn.
Jörg W Mittag

21

Các câu trả lời ở trên là tuyệt vời, nhưng tôi có một suy nghĩ khác. main()Phương pháp của Java có nghĩa là sinh viên gặp phải các mảng cơ bản từ rất sớm, thường là ngay ngày đầu tiên đến lớp. Tại sao?

public static void main(String[] args)

Đó là điều đầu tiên bạn sẽ phải đối phó để viết Hello World và hơn thế nữa. (Lúc đầu tôi đã thấy một số khóa học sử dụng các IDE dạy như BlueJ, cho phép bạn chỉ điểm và nhấp để chạy các phương thức tùy ý, nhưng chúng tôi sẽ đặt chúng sang một bên ...) Mặc dù có thể đáng để xử lý một số những từ khóa này trong một thời gian ngắn, sớm hay muộn hầu hết các giáo viên sẽ muốn giải thích chúng. Thật vậy, một câu hỏi kiểm tra trình độ cho người mới bắt đầu cổ điển là yêu cầu sinh viên đưa ra ý nghĩa của từng từ khóa trong một chương trình Hello World cơ bản. Và những gì chúng ta tìm thấy như là một phần của chữ ký phương thức chính của chúng tôi? Một mảng (Lý do cho điều đó, một phần, là lịch sử. ArrayList không tồn tại trong Java 1.0). Mảng là một phần của bộ kiến ​​thức cơ bản đó. Danh sách không có.

Điều đó nói rằng, không có gì lạ khi các lớp giới thiệu ArrayList một chút sau đó vào khóa học, đặc biệt là khi các đối tượng và việc sử dụng chúng đã được đề cập. Ngay cả giáo trình Khoa học máy tính AP cho Java cũng bao gồm ArrayList (tôi biết nó đã từng sử dụng và Google dường như chỉ ra rằng nó vẫn còn), mặc dù nó bỏ qua thực tế là ArrayList thực hiện Danh sách và phần còn lại của Khung sưu tập.

Cuối cùng, đó là kinh nghiệm của tôi khi các chương trình CS đại học sử dụng Java như một phương tiện để khám phá các khái niệm CS và lập trình thay vì dạy cho sinh viên cách trở thành nhà phát triển Java giỏi. Một số chương trình có thể tập trung hơn vào việc phát triển các nhà phát triển chuyên nghiệp trong khi các chương trình khác tập trung nhiều hơn vào lý thuyết, nhưng trong cả hai trường hợp, có rất nhiều điều để tìm hiểu về cách sử dụng Java trong công việc chuyên môn thực sự sẽ không được dạy trong hầu hết các chương trình giảng dạy đại học. Điều này bao gồm từ các mẫu thiết kế và kỹ thuật như các mẫu trong Java hiệu quả đến các khung như Spring, Hibernate hoặc JUnit hoặc thậm chí nhiều thứ phổ biến hơn như JSP hoặc JDBC. Với triết lý đó, việc nhấn mạnh các mảng trên ArrayList được sử dụng phổ biến hơn có ý nghĩa hơn một chút.


3
@Ded repeatator chắc chắn. Nó chỉ không liên quan đến quan điểm của tôi về mảng, vì vậy tôi đã bỏ qua nó. Tôi cũng không bao gồm System.out.println ("Xin chào thế giới!"); hoặc.
Zach Lipton

+1 cho các khái niệm so với các kỹ thuật hiệu quả cho "thế giới thực". Không ai dạy điều khiển phiên bản, ít nhất là khi tôi còn đi học - nhưng sau đó tôi là người cổ đại :)
David

Tôi đã tham gia một lớp hệ điều hành nơi chúng tôi phải thực hiện các phần khác nhau như một trình lập lịch biểu; chúng tôi tập trung vào một phần như vậy tại một thời điểm (độc quyền) bởi vì tại thời điểm đó chúng tôi không có khả năng làm nhiều hơn . Nhưng suy nghĩ về việc cố gắng làm cho tất cả các phần đó hoạt động cùng một lúc là điều khiến tôi (sự khởi đầu) đánh giá cao sự phức tạp của phát triển "thế giới thực" / "lập trình lớn".
David

14

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 bytesmấ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

Một kịch bản khác khi các mảng đánh bại các mảng một cách ồ ạt là khi chuỗi trong đó các phần tử trở nên khả dụng khớp với chuỗi trong đó các vị trí cuối cùng của chúng sẽ được biết đến, nhưng không khớp với chuỗi cuối cùng. Nếu permint[256]một hoán vị, người ta có thể dễ dàng đảo ngược nó với một mảng: int[] inv = new int[256]; for (int i=0; i<256; i++) inv[perm[i]]=i; Tôi không nghĩ bất cứ điều gì người ta có thể viết với một ArrayList<>sẽ sạch như vậy.
supercat

@supercat Đó không thực sự là vấn đề với mảng động, chỉ là việc triển khai cụ thể; ArrayListcó thể dễ dàng được cung cấp một hàm tạo tạo danh sách khởi tạo mặc định có kích thước nhất định.
Doval

Bạn có nguồn để sao lưu xác nhận rằng một danh sách mảng phải xử lý chi phí gọi phương thức không? Về lý thuyết thì có, nhưng trong thực tế tôi sẽ ngạc nhiên nếu getsetkhông được nội tuyến.
Doval

@Doval: Không có lý do gì một ngôn ngữ / khung được thiết kế tốt không nên cung cấp loại mảng động có thể thuận tiện thêm các mục ngoài chuỗi, nhưng Java không cung cấp loại đó.
supercat

@Doval: Ngay cả khi getsetcó thể được xếp hàng, một cái gì đó giống như myList.set(23,myList.get(23)+1)sẽ không có hiệu quả như myArray[23]+=1. Hơn nữa, ngay cả đối với các loại không cần quyền anh, tôi sẽ rất ngạc nhiên nếu bất kỳ JITter nào có thể tương đương với for (i=0; i<1000; i++) myList2.set(i+2000,myList2.get(i+3000));bất cứ thứ gì có hiệu suất ở bất cứ đâu gần System.arrayCopy(myArray1,3000,myArray2,2000,1000); đó. Không có lý do gì loại mảng động của khung không nên cung cấp thao tác sao chép nhanh, nhưng Java thì không.
supercat

7

Java cho phép các biến thuộc bất kỳ loại nào được lưu trữ thành các mảng. Ngược lại, ArrayListchỉ cho phép lưu trữ các tài liệu tham khảo. Do đó, người ta có thể không thảo luận một cách hữu ích ArrayListmà không bao gồm trước tiên về cách tự động đấm bốc sẽ chuyển đổi các kiểu nguyên thủy thành các loại tham chiếu và cách đôi khi tự động mở hộp sẽ chuyển đổi các loại tham chiếu thành nguyên thủy:

for (int i=10; i<=10000; i*=10)
{
    ArrayList<Integer> l = new ArrayList<Integer>();
    l.add(i);
    l.add(i);
    l.add(l.get(0));
    System.out.print("i=" + i);
    System.out.print(" #0==i:" + (l.get(0)==i));
    System.out.print(" #1==i:" + (l.get(1)==i));
    System.out.print(" #2==i:" + (l.get(2)==i));
    System.out.print(" #0=#1:" + (l.get(0)==l.get(1)));
    System.out.print(" #1=#2:" + (l.get(1)==l.get(2)));
    System.out.println(" #0=#2:" + (l.get(0)==l.get(2)));
}

Nếu mã đã sử dụng int[3]thay vì một ArrayList, sẽ không có gì bất ngờ. Tất cả ba yếu tố sẽ so sánh bằng ivà với nhau. ArrayListTuy nhiên, bằng cách sử dụng , mặc dù cả ba yếu tố của danh sách sẽ luôn so sánh bằng nhau ivà thứ nhất và thứ ba sẽ luôn so sánh bằng nhau, hai yếu tố đầu tiên sẽ chỉ bằng nhau khi ilà 1, 10 hoặc 100, nhưng (trên hầu hết các triển khai) không phải ilà khi 1000 hoặc 10000.


Bạn có thể giải thích tại sao # 0 và # 1 sẽ bằng nhau khi chúng là 1 hoặc 10 hoặc 100 không? Tôi theo dõi đến thời điểm đó.
Matthew Đọc

2
@MatthewRead: IntegerLớp có lớp lồng nhau được gọi là IntegerCachechứa các Integerđối tượng được khởi tạo trước cho một phạm vi các giá trị thường kéo dài -128..127; đấm bốc một giá trị ngoài phạm vi đó sẽ yêu cầu tạo một đối tượng mới, nhưng đấm bốc một giá trị trong phạm vi được lưu trong bộ nhớ cache sẽ chỉ trả về một tham chiếu đến một trong các đối tượng được khởi tạo trước được lưu trữ trong đó IntegerCache.cache. Bất kỳ lập trình viên Java giỏi nào cũng cần lưu ý rằng hai Integerbiến số đóng gói cùng một giá trị có thể hoặc không thể so sánh bằng nhau, nhưng đưa ra ý tưởng đó quá sớm có thể khiến sinh viên chạy trốn trong khủng bố.
supercat

Huh, không bao giờ có thể đoán nó là do các đối tượng tiền hôn nhân. Cảm ơn bạn về thông tin!
Matthew Đọc

1
@MatthewRead: Tôi ước Java không cho phép một số loại chuyển đổi ngầm định với ==. Với khả năng tự động hủy hộp có thể ném, tôi có xu hướng không cho phép hoàn toàn, nhưng hành vi của nó ==đặc biệt kinh khủng. Các ==nhà điều hành cũng cư xử xấu trong trường hợp như thế 16777217==16777216f[báo cáo đúng], và chuyển đổi tiềm ẩn cho long v=Math.Round(123456789), w=Math.Round(123456789012345)có khuynh hướng được bất ngờ [bạn có thể đoán những gì những biểu hiện sẽ mang lại?]
supercat

Đối với IntegerCache, chắc chắn có những lúc nó có thể giúp hiệu suất, nhưng nó có thể thường xuyên gây ra mã mà chỉ đơn giản là sai cho công việc sắp xếp. Theo một số cách, tôi ước có một chế độ trong đó quyền anh sẽ trả lại ngẫu nhiên các đối tượng từ hai bộ đệm nguyên và thay thế ngẫu nhiên các mục bộ đệm bằng các mục mới, để mã dựa vào hành vi đấm bốc của các giá trị -128..127 khó có thể thành công lâu dài.
supercat

6

Tôi nghĩ sẽ hợp lý khi dạy cách sử dụng mảng trước tiên do thực tế ArrayListsử dụng một mảng bên trong. Các ArrayListlớp học có một biến thành viên gọi elementDatađó là một Objectmảng.

Từ ArrayList mã nguồn JDK :

/**
 * The array buffer into which the elements of the ArrayList are stored.
 * The capacity of the ArrayList is the length of this array buffer.
 */
private transient Object[] elementData;

Khi bạn thêm, cập nhật, truy xuất hoặc xóa các phần tử khỏi ArrayListnó, nó sử dụng mảng bên trong này để thực hiện các thao tác đó. Như người dùng Ixrec đã chỉ ra - ArrayListchỉ là một sự trừu tượng hóa ở cấp độ cao hơn, thường dễ làm việc hơn.


Nhưng một mảng sử dụng một con trỏ tới một khối bộ nhớ, bên trong. Tại sao bắt đầu ở mức độ trừu tượng cụ thể đó?

Câu hỏi được gắn thẻ là Java- Nó đã hỏi tại sao dạy các mảng khi bạn thường sử dụng ArrayList. Java không có con trỏ. Đúng hay sai, tôi cho rằng C / C ++ là ngôn ngữ tốt hơn để bắt đầu sinh viên với Java. Nhiều chủ đề trong lập trình có thể được hiểu rõ hơn bằng cách có kiến ​​thức về C / C ++.
Derek W

3

Giả sử danh sách đó thực sự dễ làm việc hơn, như bạn nói - điều đó không thực sự quan trọng. Học tập là về "cơ bản đến phức tạp" hơn là "dễ đến khó". Nếu các nguyên tắc cơ bản không quan trọng, thì khoa học máy tính sẽ không phải là một lĩnh vực học thuật. Bạn chỉ có thể tìm hiểu cách nhấp vào các ứng dụng bằng cách sử dụng các khung / thư viện hiện có từ các hướng dẫn trực tuyến. (Tất nhiên, ai đó phải viết những thư viện đó ... và ai đó phải triển khai ArrayListngay từ đầu ....)


Trong nhiều trường hợp, việc sử dụng ArrayListcó thể được xử lý tốt hơn bằng cách sử dụng một mảng riêng và đếm "liveItems", ngoại trừ việc không có cách nào thuận tiện để làm việc với mảng và đếm cùng nhau trừ khi tổng hợp chúng.
supercat

2

Đó là bởi vì điều quan trọng nhất trong giáo dục học thuật là dạy bạn sử dụng thuật ngữ chính xác để mô tả những việc bạn làm.

Danh sách là một cái gì đó khác mảng. và Bạn không thể sử dụng java.util.Listtrong Java vì đó là giao diện. Bạn thường sử dụng java.util.ArrayListviệc thực hiện Danh sách, không phải là danh sách, mà là trình bao bọc đối tượng xung quanh mảng động. Vì vậy, bạn nói rằng bạn sử dụng một 'Danh sách' nhưng bạn sử dụng một mảng.

Rất hợp lý để bỏ qua sự hỗn loạn thuật ngữ đó và chỉ cần sử dụng mảng để học sinh học mảng là gì. Nếu bạn sử dụng mảng trong Java, ít nhất bạn sử dụng mảng.

Thành thật mà nói, đó cũng là lý lẽ tại sao dạy lập trình với Java không phải là một ý tưởng tốt. Thật khó để học các khái niệm cơ bản của lập trình một cách chính xác.


Thế còn hashmap? theo cách nào đó, một mảng chỉ là một loại hashmap.
Thufir 13/03/2015

@Thufir làm thế nào một mảng có thể là một hashmap? Đó là những cấu trúc dữ liệu hoàn toàn khác nhau.
Thủy thủ Danubian

bạn có thể biểu diễn một mảng bằng hàm băm. cái nào "cơ bản" hơn? Tôi cho rằng hashmap thú vị hơn về mặt khái niệm.
Thufir 13/03/2015

1
@Thufir không, bạn không thể. Bạn chỉ có thể thi đua. Bên trong mỗi cấu trúc dữ liệu sẽ là những gì nó được. Đó là những điều khác nhau về cơ bản và khái niệm. Đây là lý do tại sao nên bắt đầu học lập trình với các ngôn ngữ trừu tượng cao như Java hoặc JavaScript. Không rõ ở đó, cấu trúc dữ liệu thực sự là gì.
Thủy thủ Danubian

1

Bạn thực sự chưa bao giờ nhìn thấy hoặc sử dụng bất kỳ mảng nào? Chúng tôi sử dụng chúng mọi lúc, ngoài danh sách. Chúng tôi thường không sử dụng Java, nhưng chúng tôi sử dụng nhiều ngôn ngữ khác có sự tương đồng rõ ràng.

Giữa các mảng và Danh sách, một trọng lượng nhẹ hơn và, ngoài ra, nhiều điểm hơn, trong khi các mảng khác có nhiều chức năng hơn. Như một quy tắc chung trong lập trình, khi có hai loại tương tự về cơ bản được phân chia dọc theo các dòng đó, bạn nên chọn loại có trọng lượng nhẹ hơn trừ khi bạn thực sự cần loại fancier. Ngoài việc giảm chi phí, điều này thực sự giúp kiểm soát lượng lộn xộn và trạng thái trong chương trình và đặc biệt là mã của nó . Nếu có lỗi xảy ra trong quá trình thử nghiệm, bạn có ít nơi để tìm hơn; và quan trọng hơn trong trường hợp mảng so với Danh sách, mọi người hiểu rõ hơn về phạm vi giới hạn của những gì bạn thực sự sử dụng nó và cố gắng thực hiện với nó.

Và vâng, từ quan điểm học thuật, có thêm lý do dạy học sinh những điều cơ bản. Tuy nhiên điều này đi sâu hơn một chút. Mảng và Danh sách là một ví dụ điển hình về các loại cồng kềnh thường chỉ được xây dựng trên đầu và thường chỉ quấn quanh, các thể hiện cơ bản của các loại trọng lượng nhẹ hơn. Ngay cả khi Danh sách không có mảng cơ bản, chúng vẫn cư xử hướng ngoại như chúng. Một phần của việc dạy cho ai đó về Danh sách là gì để dạy cho họ biết một mảng là gì.

Tôi có thể thấy điều này có thể vượt khỏi tầm tay trong một ngôn ngữ như C ++, trong đó các mảng về cơ bản không thể bị tước bỏ nhiều hơn so với chúng, nhưng trong các ngôn ngữ cấp cao hơn, chúng gần như tự liệt kê. Nếu chúng phù hợp hoàn hảo với nhu cầu của bạn trong một tình huống nhất định, tại sao bạn lại cần sử dụng thứ khác?


Tôi sẽ không nói rằng một danh sách có chức năng "nhiều hơn", nhiều như nó có chức năng "khác nhau". Một cái mới T[]sẽ sẵn sàng, ngay ngoài cổng, để chấp nhận các mục theo bất kỳ thứ tự nào, trong khi ArrayList<T>yêu cầu các mục đó phải được thêm vào, theo thứ tự, trước khi chúng có thể được sửa đổi. A T[]có thể sao chép một phạm vi các mục tùy ý sang một phạm vi tương tự của một mục khác T[]tương đối nhanh chóng, trong khi ArrayList<T>sẽ yêu cầu đọc các mục riêng lẻ trong một danh sách và lưu trữ chúng sang mục khác - chậm hơn và ít thuận tiện hơn.
supercat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.