2010-02-22 47 views
284

Sự khác nhau giữa ArrayListList<> trong C# là gì?ArrayList vs List <> in C#

Chỉ có List<> có loại trong khi ArrayList không?

+5

thể trùng lặp của [ArrayList vs Danh sách ] (http://stackoverflow.com/questions/391088/arraylist-vs-listobject) –

+4

Đó là một đóng câu hỏi, nhưng tôi nghĩ rằng không chính xác trùng lặp. Điều này hỏi về 'Danh sách <>' nói chung, trong khi người đó hỏi về 'Danh sách ' cụ thể là – goodeye

+0

Tìm thấy blog rất hữu ích này, nó có thể hữu ích. Tôi nên chia sẻ liên kết: http://fintechexplained.blogspot.co.uk/2017/07/data-structures-comparison.html – InfoLearner

Trả lời

399

Có, khá nhiều. List<T> là một lớp chung. Nó hỗ trợ lưu trữ các giá trị của một loại cụ thể mà không cần truyền đến hoặc từ object (có thể phát sinh chi phí đấm bốc/mở hộp khi T là loại giá trị trong trường hợp ArrayList). ArrayList chỉ cần lưu trữ các tài liệu tham khảo object. Là bộ sưu tập chung, List<T> triển khai giao diện chung IEnumerable<T> và có thể được sử dụng dễ dàng trong LINQ (không yêu cầu bất kỳ cuộc gọi nào Cast hoặc OfType).

ArrayList thuộc về những ngày mà C# không có Generics. Nó không được chấp thuận vì lợi ích của List<T>. Bạn không nên sử dụng ArrayList trong mã mới nhắm mục tiêu .NET> = 2.0 trừ khi bạn phải giao tiếp với API cũ sử dụng API đó.

+2

Một điểm đáng nói khác là danh sách chung loại bỏ quyền anh đối với các loại giá trị. – Joe

+32

@Joe: Vâng, tôi đã đề cập rằng trong câu thứ ba của tôi. –

+0

Bạn có thể giải thích lý do tại sao bạn sử dụng "boxing" chứ không phải "casting"? Điều gì xảy ra ở đây? Các đối tượng được phân bổ/deallocated? –

1

ArrayList là tập hợp các loại dữ liệu khác nhau trong khi List<> là tập hợp các loại tương tự của mã số riêng của nó.

76

Sử dụng List<T> bạn có thể ngăn chặn lỗi truyền. Sẽ rất hữu ích nếu bạn gặp lỗi khi chạy thời gian chạy.

Ví dụ:

đây (sử dụng ArrayList), bạn có thể biên dịch mã này, nhưng bạn sẽ thấy một lỗi thực hiện sau đó.

ArrayList array1 = new ArrayList(); 
array1.Add(1); 
array1.Add("Pony"); //No error at compile process 
int total = 0; 
foreach (int num in array1) 
{ 
total += num; //-->Runtime Error 
} 

Nếu bạn sử dụng List, bạn tránh được các lỗi này:

List<int> list1 = new List<int>(); 
list1.Add(1); 
//list1.Add("Pony"); //<-- Error at compile process 
int total = 0; 
foreach (int num in list1) 
{ 
total += num; 
} 

tham khảo: MSDN

+0

Bạn có thể kiểm tra loại khi bạn kéo từ ArrayList để ngăn chặn lỗi truyền. Ngày nay mọi người sử dụng đối tượng, làm cho ArrayList không còn cần thiết nữa. – Switch

+1

i +1 để biện minh nhưng bạn vẫn có thể làm nếu (num là int) {} vào danh sách mảng của bạn để tránh lỗi –

+0

bước bổ sung nhưng khả thi. – Si8

22

Để thêm vào những điểm nêu trên. Sử dụng ArrayList trong hệ điều hành 64bit mất bộ nhớ gấp 2 lần so với sử dụng trong hệ điều hành 32 bit. Trong khi đó, danh sách chung List<T> sẽ sử dụng bộ nhớ thấp hơn nhiều so với ArrayList.

ví dụ: nếu chúng tôi sử dụng ArrayList trong số 19MB trong 32 bit, nó sẽ mất 39MB trong 64 bit. Nhưng nếu bạn có một danh sách chung List<int> của 8MB trong 32-bit nó sẽ chỉ mất 8,1MB trong 64-bit, đó là một whooping 481% sự khác biệt khi so sánh với ArrayList.

Nguồn: ArrayList’s vs. generic List for primitive types and 64-bits

+1

chỉ đúng để lưu trữ loại giá trị, không phải loại tham chiếu. sự khác biệt là do thực tế là một arraylist chỉ có thể chứa con trỏ, và dữ liệu chính nó cần phải được lưu trữ ở nơi khác. Mặt khác, các loại giá trị có thể được lưu trữ trực tiếp trong một danh sách. –

-6

Nó không chỉ khác biệt. Các thành viên ArrayList có thể được truy cập thông qua chỉ mục như mảng thông thường và thành viên ArrayList có thể dễ dàng được sắp xếp theo thứ tự trực tiếp và ngược lại và hai ArrayList có thể dễ dàng hợp nhất, không phải là trường hợp với Danh sách đơn giản. Xem thêm trên

http://www.cirvirlab.com/index.php/c-sharp-code-examples/112-c-sharp-arraylist-example.html

+2

Danh sách có các thuộc tính giống nhau - về cơ bản giống với C++ vector . – DarkWanderer

+0

Vượt qua vì câu trả lời này gây hiểu nhầm. Các tính năng được mô tả của ArrayList cũng được tìm thấy trong Danh sách. – miroxlav

-3

Để tôi biết tất cả về việc biết dữ liệu của bạn. Nếu tôi tiếp tục mở rộng mã của mình trên cơ sở hiệu quả, tôi sẽ phải chọn tùy chọn Danh sách như một cách giải mã dữ liệu của mình với bước không cần thiết luôn luôn tự hỏi về các loại, đặc biệt là 'Loại tùy chỉnh'.Nếu máy hiểu được sự khác biệt và có thể xác định được loại dữ liệu mà tôi thực sự đang xử lý thì tại sao tôi phải cản đường và lãng phí thời gian đi qua các vòng quay của 'IF THEN ELSE'? Triết lý của tôi là để máy làm việc cho tôi thay vì tôi làm việc trên máy? Việc biết được sự khác biệt duy nhất của các lệnh mã đối tượng khác nhau sẽ làm cho mã của bạn hiệu quả.

Tom Johnson (Một nhập ... Một Exit)

-2

Sử dụng "Danh sách" bạn có thể ngăn chặn các lỗi đúc. Nó rất hữu ích để tránh một lỗi đúc thời gian chạy.

Ví dụ:

Ở đây (sử dụng ArrayList), bạn có thể biên dịch mã này nhưng bạn sẽ thấy lỗi thực thi sau này.

// Create a new ArrayList 


    System.Collections.ArrayList mixedList = new System.Collections.ArrayList(); 


    // Add some numbers to the list 
    mixedList.Add(7); 
    mixedList.Add(21); 


    // Add some strings to the list 
    mixedList.Add("Hello"); 
    mixedList.Add("This is going to be a problem"); 




    System.Collections.ArrayList intList = new System.Collections.ArrayList(); 
    System.Collections.ArrayList strList = new System.Collections.ArrayList(); 


    foreach (object obj in mixedList) 
    { 
     if (obj.GetType().Equals(typeof(int))) 
     { 
      intList.Add(obj); 
     } 
     else if (obj.GetType().Equals(typeof(string))) 
     { 
      strList.Add(obj); 
     } 
     else 
     { 
      // error. 
     } 
    } 
+0

Điều này thêm gì ngoài các câu trả lời cho ba năm trước? Nó có hầu hết cùng một văn bản nguyên văn, không liên kết với nguồn, mà không có định dạng đúng, v.v. –

16

Một điểm khác biệt cần thêm là đối với Đồng bộ hóa chủ đề.

ArrayList cung cấp một số chủ đề an toàn thông qua thuộc tính Đồng bộ hóa, trả về trình bao bọc an toàn theo chủ đề xung quanh bộ sưu tập. Trình bao bọc hoạt động bằng cách khóa toàn bộ bộ sưu tập trên mọi thao tác thêm hoặc xóa. Do đó, mỗi chuỗi đang cố truy cập bộ sưu tập phải đợi đến lượt của nó để lấy một khóa. Điều này không thể mở rộng và có thể gây ra sự suy giảm hiệu suất đáng kể cho các bộ sưu tập lớn.

List<T> không cung cấp bất kỳ đồng bộ hóa luồng nào; mã người dùng phải cung cấp tất cả đồng bộ hóa khi các mục được thêm hoặc xóa trên nhiều luồng đồng thời. Thông tin

More đây Thread Synchronization in the .Net Framework

+0

Hãy cung cấp liên kết nguồn. – Salar

+0

Tôi không nói bạn nên sử dụng 'ArrayList' nếu nó có thể tránh được, nhưng đây là một lý do ngớ ngẩn. Các wrapper là hoàn toàn tùy chọn sau khi tất cả; nếu bạn không cần khóa hoặc nếu bạn cần kiểm soát chi tiết hơn, không sử dụng trình bao bọc. – Thorarin

+0

Nếu bạn muốn an toàn chủ đề, tôi khuyên bạn nên xem xét không gian tên System.Collections.Concurrent trước khi xem xét ArrayList. – Ykok

3

ArrayList không gõ an toàn trong khi List<T> được an toàn loại. Đơn giản :).

0
  • ArrayList không có giới hạn loại để lưu trữ dữ liệu tức là nó không phải là Loại an toàn. Bạn có thể lưu trữ bất cứ thứ gì trong ArrayList. Trong thực tế, ArrayList có thể lưu trữ nhiều loại đối tượng.
  • Trong Danh sách chung (Danh sách), T có nghĩa là kiểu dữ liệu, tức là chuỗi, int, DateTime, v.v. Do đó, nó sẽ chỉ lưu trữ các loại đối tượng cụ thể dựa trên loại dữ liệu nào đã được chỉ định trong khi khai báo. Vì vậy nếu bạn có một danh sách chung của chuỗi bạn chỉ có thể lưu trữ các giá trị chuỗi, bất cứ điều gì khác sẽ cung cấp cho lỗi biên dịch. Lấy dữ liệu trở lại cũng là rắc rối miễn phí và không chuyển đổi loại cần