2012-05-25 71 views
14

thể trùng lặp:
When to use ArrayList over array[] in c#?Sự khác biệt đáng kể trong Array vs Array List?

Từ góc nhìn của chi phí bộ nhớ hoặc bộ xử lý, không có vẻ như là một sự khác biệt đáng kể giữa một mảng và một đối tượng ArrayList?

+0

@NikhilAgrawal không trùng lặp với chủ đề đó vì câu hỏi cụ thể về sự khác biệt về hiệu suất, không phải ngữ cảnh sử dụng. – Asik

+0

Tôi nghi ngờ ArrayList sẽ chậm hơn khi bạn phải bỏ từng phần tử trong mảng khi truy xuất. – Matthew

Trả lời

41

Mảng (Không gian tên hệ thống) là kiểu dữ liệu, có thể được sử dụng bằng cách gọi các chỉ mục. trong thời gian chạy, người ta không thể thực sự thay đổi kích thước của mảng, trừ khi bạn sử dụng phương pháp sao chép mảng và loại bỏ mảng cũ.

Trong .NET, Visual Studio sử dụng một lớp đặc biệt để lưu trữ dữ liệu. Bởi vì điều này, hiệu suất thực sự là khá nhanh. Điều này cũng bởi vì trong một mảng, bạn cần xác định kích thước và do đó, dữ liệu được lưu trữ sau cái kia.

Ví dụ:

int[] myNumbers= new int[5]; 
myNumbers[0] = 16; 

ArrayList (System.Collections namespace) là một tập hợp kiểu dữ liệu. Để điền vào một ArrayList, người ta có thể sử dụng phương thức .Add. ArrayLists là rất năng động theo nghĩa là khi bạn thêm và/hoặc loại bỏ các mục từ nó, các performace vẫn như cũ.

Cấu trúc bên trong của ArrayList là một mảng.

Ví dụ:

ArrayList myArray = new ArrayList(); 
myArray.Add(“Steph”); 
string str = myArray[0]; 

Hầu hết thời gian, chúng ta có xu hướng chọn danh sách mảng chứ không phải là mảng vì chúng ta không có ý tưởng lớn như thế nào nó sẽ bật ra. Mảng là lý tưởng khi bạn biết có bao nhiêu mục bạn sẽ đặt trong đó. Bất cứ khi nào có thể, bạn nên sử dụng mảng vì điều này cải thiện đáng kể hiệu suất.

Mảng là chuỗi dữ liệu đồng nhất trong khi ArrayList là chuỗi dữ liệu không đồng nhất. Đó là lý do tại sao chúng tôi phải đánh máy mọi dữ liệu trong ArrayLists.

Mảng đa chiều nhưng ArrayList luôn là một chiều.

Mảng được nhập mạnh mẽ và hoạt động tốt như thông số. Nếu bạn biết độ dài của bộ sưu tập của bạn và nó được cố định, bạn nên sử dụng một mảng.

ArrayLists không được nhập mạnh, mỗi lần chèn hoặc thử lại sẽ cần một dàn diễn viên để quay lại loại ban đầu của bạn. Nếu bạn cần một phương thức để lấy một danh sách một kiểu cụ thể, thì ArrayLists sẽ thiếu vì bạn có thể truyền vào một ArrayList chứa bất kỳ kiểu nào. ArrayLists sử dụng một mảng động mở rộng trong nội bộ, do đó, cũng có một hit để mở rộng kích thước của mảng nội bộ khi nó chạm vào dung lượng của nó.

+0

Có một đối tượng khác được gọi là Danh sách đơn giản. Nó so sánh với ArrayList như thế nào. Mà dường như là một điều khiển tinh vi hơn. –

+2

Danh sách là sự kết hợp các thuộc tính tốt của Array và Array List. Giống như Array nó chứa dữ liệu đồng nhất. Giống như ArrayList, bạn có thể tiếp tục thêm nhiều dữ liệu tùy thích. –

6

Mảng là cấu trúc dữ liệu cấp thấp về cơ bản ánh xạ tới một vùng trong bộ nhớ. An ArrayList là danh sách độ dài biến được triển khai dưới dạng mảng object được phân bổ lại khi danh sách tăng lên.

ArrayList do đó có một số chi phí liên quan đến việc quản lý kích thước của mảng nội bộ và chi phí liên quan đến việc truyền đối tượng sang loại chính xác khi bạn truy cập danh sách.

Ngoài ra, lưu trữ mọi thứ dưới dạng object có nghĩa là các loại giá trị được đóng hộp khi viết và không được mở khi đọc, điều này cực kỳ bất lợi cho hiệu suất. Sử dụng List<T>, danh sách kích thước biến tương tự nhưng được đánh máy mạnh sẽ tránh được vấn đề này.

Trong thực tế, ArrayList được thực tế không dùng nữa vì lợi ích của List<T> kể từ .NET 2.0.

+0

Có một đối tượng khác được gọi là Danh sách đơn giản. Nó so sánh với ArrayList như thế nào. Mà dường như là một điều khiển tinh vi hơn. –

+0

@MikeOlson Tôi đã giải thích rằng trong câu trả lời của tôi đã ... bạn đã đọc nó chưa? – Asik

+0

Rất tiếc, tôi đã đọc nó nhưng không chắc liệu Danh sách có giống với danh sách đơn giản hay không. Vì vậy, về cơ bản danh sách đơn giản này về cơ bản đã thay thế danh sách Array có lợi cho dễ sử dụng? –

1

Một mảng là khối liên tiếp của bộ nhớ có kích thước cố định, trong khi ArrayList (mặc dù bạn nên chọn Danh sách từ .NET 2.0) kết thúc một mảng để cung cấp bộ nhớ có thể thay đổi kích thước động.

"Sự khác biệt" giữa chúng là như vậy, theo như chúng được đóng gói, một ArrayList có thể thay đổi kích cỡ, một mảng thì không. Theo như thực hiện là có liên quan: bởi vì một mảng ArrayList kết thúc (và reallocates) nó sẽ đòi hỏi nhiều bộ nhớ hơn một mảng (vì nó phải biết số lượng các phần tử hiện tại, trái ngược với khả năng của nó), hơn nữa ArrayList cũng yêu cầu thời gian của CPU để tái phân bổ và sao chép mảng nội bộ của nó nếu nó đạt đến dung lượng bên trong của nó.

Tuy nhiên, việc tạo một ArrayList không đắt hơn phân bổ mảng. Sự khác biệt duy nhất là có một số ít các lệnh cần thiết để khởi tạo trạng thái của ArrayList. Sự khác biệt là không đáng kể và không đáng lo ngại.

Bạn sẽ thấy rằng nếu bạn đang tái phân bổ mảng bằng chính mình như là phương tiện tạo bộ sưu tập có thể thay đổi kích cỡ thì bạn nên sử dụng ArrayList/List vì nó đã được kiểm tra kỹ lưỡng.

+1

Có một đối tượng khác được gọi là Danh sách đơn giản. Nó so sánh với ArrayList như thế nào. Mà dường như là một điều khiển tinh vi hơn. –

+0

Sự khác biệt chính giữa ArrayList và Danh sách chung là danh sách chung là loại an toàn trong khi arraylist không. – DinoMyte

Các vấn đề liên quan